我認爲最好先構建一個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
。