6

我正试图从法国下议院网站的两页上刮掉所有法案。这些页面涵盖 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

有任何想法吗?谢谢!

4

2 回答 2

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

于 2014-03-18T23:13:50.077 回答
-5

为什么使用 R?对于大型抓取工作,您最好使用已经为该任务开发的东西。我在 Down Them All 中取得了不错的效果,这是一个浏览器插件。只需告诉它从哪里开始,走多远,遵循什么模式,以及在哪里转储 HTML。

然后使用 R 从 HTML 文件中读取数据。

优点是巨大的——这些附加组件是专门为任务开发的,所以它们会进行多次下载(由你控制),它们会发送正确的标题,所以你的下一个问题不会是“我如何设置用户代理字符串RCurl?',当某些下载失败时,他们可以应对重试,这是不可避免的。

当然,缺点是您不能轻松地自动启动此过程,在这种情况下,您最好在命令行上使用“curl”或其他一些命令行镜像实用程序。

老实说,与用 R 编写网站代码相比,你有更好的时间来做...

于 2012-04-09T08:03:12.560 回答