感谢帖子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)
但它不起作用。有什么建议吗?
答案 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
。