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