2016-11-10 53 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