我正试图从法国下议院网站的两页上查获所有账单。这些页面涵盖了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()
功能?我似乎无法通过传递async=TRUE
选项来使用并发下载,每次都会出现相同的错误:
Error in function (type, msg, asError = TRUE) :
Failed to connect to 0.0.0.12: No route to host
有什么想法吗?谢谢!
答案 0 :(得分:1)
尝试mclapply {multicore}而不是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)
答案 1 :(得分:-5)
为什么要使用R?对于大型裁剪工作,最好使用已经为此任务开发的东西。我用Down Them All获得了很好的效果,一个浏览器添加。只需告诉它从哪里开始,要走多远,遵循什么模式,以及转储HTML的位置。
然后使用R从HTML文件中读取数据。
优点是巨大的 - 这些附加组件是专门为任务开发的,因此它们可以进行多次下载(可由您控制),它们将发送正确的标题,因此您的下一个问题将不是“如何设置用户使用RCurl的代理字符串?',当一些下载失败时,他们可以应对重试,这是他们不可避免的。
当然缺点是您无法轻松自动启动此过程,在这种情况下,您可能最好使用命令行上的'curl'或其他命令行镜像实用程序。
老实说,你有更好的时间来处理你的时间而不是在R中写网站代码......