簡體   English   中英

如何在 R 中使用 getURL() 優化抓取

[英]How to optimise scraping with getURL() in R

我正試圖從法國下議院網站上的兩個頁面上刪除所有法案。 這些頁面涵蓋 2002 年至 2012 年,每頁代表不到 1,000 張賬單。

為此,我通過這個循環使用getURL進行抓取:

b <- "http://www.assemblee-nationale.fr" # base
l <- c("12","13") # legislature id

lapply(l, FUN = function(x) {
  print(data <- paste(b, x, "documents/index-dossier.asp", sep = "/"))

  # scrape
  data <- getURL(data); data <- readLines(tc <- textConnection(data)); close(tc)
  data <- unlist(str_extract_all(data, "dossiers/[[:alnum:]_-]+.asp"))
  data <- paste(b, x, data, sep = "/")
  data <- getURL(data)
  write.table(data,file=n <- paste("raw_an",x,".txt",sep="")); str(n)
})

有什么辦法可以優化這里的getURL() function 嗎? 我似乎無法通過傳遞async=TRUE選項來使用並發下載,這每次都會給我同樣的錯誤:

Error in function (type, msg, asError = TRUE)  : 
Failed to connect to 0.0.0.12: No route to host

有任何想法嗎? 謝謝!

嘗試使用 mclapply {multicore} 而不是 lapply。

“mclapply 是 lapply 的並行版本,它返回一個與 X 長度相同的列表,其中每個元素都是將 FUN 應用於 X 的相應元素的結果。” ( http://www.rforge.net/doc/packages/multicore/mclapply.html )

如果這不起作用,您可能會使用XML package 獲得更好的性能。像 xmlTreeParse 這樣的函數使用異步調用。

“請注意,xmlTreeParse 確實允許混合處理樣式,允許我們在樹中的節點被轉換為 R 對象時將處理程序應用於樹中的節點。這是一種事件驅動或異步調用的樣式。” ( http://www.inside-r.org/packages/cran/XML/docs/xmlEventParse )

為什么要用R? 對於大的抓取工作,你最好使用已經為該任務開發的東西。 我使用瀏覽器插件 Down Them All 取得了不錯的效果。 只需告訴它從哪里開始,到 go 有多深,遵循什么模式,以及在哪里轉儲 HTML。

然后使用R讀取HTML文件中的數據。

優點是巨大的——這些附加組件是專門為任務開發的,所以它們會進行多次下載(由你控制),它們會發送正確的標題,這樣你的下一個問題就不會是“我如何設置用戶代理字符串” RCurl?',他們可以在某些下載失敗時重試,這是他們不可避免的。

當然,缺點是您不能輕松地自動啟動此過程,在這種情況下,您最好在命令行上使用“curl”或其他一些命令行鏡像實用程序。

老實說,與在 R 中編寫網站代碼相比,您有更好的時間來做……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM