2012-04-09 37 views
6

我正試圖在法國議會下議院的網站上從兩頁中刪除所有法案。這些網頁覆蓋了2002 - 2012年,並且每個賬單少於1,000個賬單。如何在R中使用getURL()優化刮取

對於這一點,我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()功能?我似乎無法通過傳遞async=TRUE選項,這給了我同樣的錯誤每次使用併發下載:

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

任何想法?謝謝!

+1

'異步= TRUE'已經是如果你給多個URL默認 - 但開放同一網站 超過500個併發連接的可能不是一個好主意...... – 2012-04-09 03:34:35

+0

好吧。那麼,我似乎無法改變getURL()'到目前爲止的工作方式。 – 2012-04-09 11:23:59

回答

1

嘗試mclapply {}多核代替lapply。

「mclapply是lapply的並行化版本,它返回的 相同的長度爲X的列表,其中的每個元素是將 FUN到X的相應元素的結果」 (http://www.rforge.net/doc/packages/multicore/mclapply.html

如果不工作,你可以使用XML包獲得更好的性能。像xmlTreeParse這樣的函數使用異步調用。

「注意xmlTreeParse確實允許的處理的混合動力風格 允許我們處理程序適用於樹中的節點,因爲他們正在 轉化爲R的物體。這是事件驅動或 異步的風格通話中「。 (http://www.inside-r.org/packages/cran/XML/docs/xmlEventParse

+0

不錯!我不知道'mclapply',但這是一個很棒的建議。自從我問了這個問題後,我發現了你的第二個選擇(使用'''而不是'getURL'),並且工作得很好。在你看來,並行化一個使用'htmlParse'解析HTML的循環會是多麼的矯枉過正? – 2014-03-20 09:29:10

+0

這可能會更快地抓取數據,但如果您的速度收益不是非常顯着,那麼編寫代碼可能會導致時間的淨損失。這取決於您的數據集的大小。 – rsoren 2014-03-26 20:13:17

+0

這不足以證明這一點。謝謝 :) – 2014-03-26 22:05:30

-4

爲什麼使用R?對於大型刮板工作,您最好使用已經完成的任務。 Down Them All是一款瀏覽器,我已經獲得了不錯的成績。只要告訴它從哪裏開始,要走多深,要遵循哪些模式,以及在何處轉儲HTML。

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

優勢是巨大的 - 這些附加組件是專門爲任務開發的,所以它們將執行多次下載(由您控制​​),它們將發送正確的標題,因此您的下一個問題將不會是'我如何設置用戶代理字符串與RCurl?',他們可以應付重試,當一些下載失敗,這是他們不可避免的。

當然,缺點是您不能自動輕鬆啓動此過程,在這種情況下,您最好在命令行上使用'curl'或其他命令行鏡像實用程序。

老實說,你有更好的事情要做你的時間比在R寫入網站代碼...

+3

我使用R進行數據提取之後的分析!我正在將操作完全複製,所以第三個應用程序不會這樣做。不過,我也接受了Python的建議。 – 2012-04-09 11:23:21

+0

爲什麼Python可以,但在命令行上使用'curl'(可能通過系統調用R)不是?你只是試圖通過python或R來複制命令行curl的功能,這是一個毫無意義的努力。您仍然可以使用R,只需在下載和保存的文件上進行操作即可。好運與可複製的工作基於從網站上刮... – Spacedman 2012-04-09 11:41:28

+4

哦,'捲曲'會做。當然,Ruby和Python,以及bash都有很好的代碼。現在,R是沿着統計代碼分享刮碼的一種實用方式,特別是對於不定期使用代碼的用戶。至於可複製性,這是一個議會網站,他們的檔案往往持續。 – 2012-04-09 11:58:59