繁体   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