如何使用R中的getURL()优化抓取

时间:2012-04-09 02:41:24

标签: r curl web-scraping

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

有什么想法吗?谢谢!

2 个答案:

答案 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中写网站代码......