[英]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.