如何抓取索引年份+页面的多个表格?

时间:2016-11-10 10:46:43

标签: r xml

感谢帖子https://stackoverflow.com/a/7775721/7140722

但如何刮多年?

这是查询的结构:

http://aviation-safety.net/database/dblist.php?Year=1994&lang=&page=1
http://aviation-safety.net/database/dblist.php?Year=1994&lang=&page=2

我想多刮几年。我的代码:

Year <- 1990:1994

url1 = 'http://aviation-safety.net/database/dblist.php?Year='
url3 = '&lang=&page='

getPage <- function(page){
  require(XML)
  url = paste(url1, Year, url3, page, sep = "")
  tab = readHTMLTable(url, stringsAsFactors = FALSE)[[1]]
  return(tab)
}

pages    = llply(1:3,getPage, .progress = 'text') 
crash_all_Years = do.call('rbind', pages)

但它不起作用。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我认为最好首先构建一个网址列表,然后使用lapply(或ldply包中的plyr)遍历该列表以获取网页。

您可以按如下方式改进代码:

# load the 'XML' package
library(XML)

# set the variables needed to construct the urls
years <- 1990:1994
url_1 <- 'http://aviation-safety.net/database/dblist.php?Year='
url_3 <- '&lang=&page='
pages <- 1:2

# construct a list of pages to scrape
yp <- expand.grid(pages, years)
urls <- sprintf('%s%s%s%s', url_1, yp[[2]], url_3, yp[[1]])

# a simplified scrape function
getPage <- function(u){ readHTMLTable(u, stringsAsFactors = FALSE)[[1]] }

# loop over the list of urls and scrape each one
plst <- lapply(urls, getPage)

# bind the resulting list of dataframes into one dataframe
pages.df <- do.call(rbind, plst)

这将为您提供1990年至1994年每年前两页飞机失事的数据框:

> head(pages.df)
         date                             type registration                                operator fat.             location    pic cat
1 02-JAN-1990 CASA/Nurtanio NC-212 Aviocar 200       PK-PCM                      Pelita Air Service    9      Banten Bay, ...       Â  A1
2 03-JAN-1990          BN-2A Trislander Mk.III       YJ-RV3                                  Vanair    0 near Port Vila-Ba...       Â  A1
3 04-JAN-1990    Swearingen SA227-AC Metro III       N31138 Chautauqua Airlines, opf. USAir Express    0       Hagerstown, MD       Â  O1
4 05-JAN-1990       Lockheed L-100-30 Hercules       D2-THB                      Angola Air Charter    0      Menongue Air...          C1
5 05-JAN-1990      Fokker F-28 Fellowship 4000       LV-MZD                   Aerolineas Argentinas    0      Villa Gesell...          A1
6 06-JAN-1990      Lockheed L-1329 JetStar 731        N96GS                                Grecoair    1      Miami Intern...       Â  A1
> tail(pages.df)
            date                          type registration                  operator fat.        location    pic cat
995  06-NOV-1994                    Antonov 26     RA-88286 KIT Space & Transport Air    0 Omulyovka River       Â  A1
996  09-NOV-1994                    Learjet 55       PT-LIG       Líder Táxi Aéreo    0 Rio de Janei...          A1
997  12-NOV-1994 Beechcraft 200 Super King Air       D2-EOJ                   Endiama    0 Huambo-Alban...          A1
998  13-NOV-1994   Fokker F-27 Friendship 400M       7T-VRK              Air Algérie    0 Palma de Mal...         H2
999  16-NOV-1994       Beechcraft C99 Commuter       N63995               Ameriflight    1      Avenal, CA          A1
1000 18-NOV-1994                Tupolev 134A-3       HA-LBK                     Malev    0 Budapest-Fer...          O1

使用ldply,您可以将最后两个步骤合并为一个:

library(plyr)
pages.df <- ldply(urls, getPage)

注意:

  • 当您想要每年的所有网页时,请创建一个较长的pages向量。例如pages <- 1:6。不存在的URL将不会被删除,因此不会包含在最终的数据帧中。使用这个,你将获得一个1238行的数据帧,正是1990年至1994年的事故数量。
  • sprintf代码中,每个%s代表一个需要粘贴在一起的字符串。另请参阅?sprintf
相关问题