2016-11-10 75 views
1

感谢信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

我认为最好先构建一个url列表,然后用lapply(或ldply from 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。不存在的网址不会被删除,因此不会包含在最终的数据框中。使用这种方法,您将得到一个1238行的数据框,与1990 - 1994年的事故数完全相同。
  • sprintf代码中,每个%s表示需要粘贴在一起的字符串。另见?sprintf