使用并行化用R抓取网页

info_seekeR

我正在尝试抓取大量网页,以便以后对其进行分析。由于网址数量众多,因此我决定将parallel包与一起使用XML

具体来说,我正在使用htmlParse()from函数XML,该函数与一起使用时效果很好sapply,但与一起使用时会生成类HTMLInternalDocument的空对象parSapply

url1<- "http://forums.philosophyforums.com/threads/senses-of-truth-63636.html"
url2<- "http://forums.philosophyforums.com/threads/the-limits-of-my-language-impossibly-mean-the-limits-of-my-world-62183.html"
url3<- "http://forums.philosophyforums.com/threads/how-language-models-reality-63487.html"

myFunction<- function(x){
cl<- makeCluster(getOption("cl.cores",detectCores()))
ok<- parSapply(cl=cl,X=x,FUN=htmlParse)
return(ok)
}

urls<- c(url1,url2,url3)

#Works
output1<- sapply(urls,function(x)htmlParse(x))
str(output1[[1]])
> Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument', 'oldClass' <externalptr>
output1[[1]]


#Doesn't work
myFunction<- function(x){
cl<- makeCluster(getOption("cl.cores",detectCores()))
ok<- parSapply(cl=cl,X=x,FUN=htmlParse)
stopCluster(cl)
return(ok)
}

output2<- myFunction(urls)
str(output2[[1]])
> Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument', 'oldClass' <externalptr>
output2[[1]]
#empty

谢谢。

研究

您可以使用getURIAsynchronousRcurl程序包,该程序包允许调用方指定多个URI来同时下载。

library(RCurl)
library(XML)
get.asynch <- function(urls){
  txt <- getURIAsynchronous(urls)
  ## this part can be easily parallelized 
  ## I am juste using lapply here as first attempt
  res <- lapply(txt,function(x){
    doc <- htmlParse(x,asText=TRUE)
    xpathSApply(doc,"/html/body/h2[2]",xmlValue)
  })
}

get.synch <- function(urls){
  lapply(urls,function(x){
    doc <- htmlParse(x)
    res2 <- xpathSApply(doc,"/html/body/h2[2]",xmlValue)
    res2
  })}

在这里,对于100个网址的一些基准测试将解析时间除以2。

library(microbenchmark)
uris = c("http://www.omegahat.org/RCurl/index.html")
urls <- replicate(100,uris)
microbenchmark(get.asynch(urls),get.synch(urls),times=1)

Unit: seconds
             expr      min       lq   median       uq      max neval
 get.asynch(urls) 22.53783 22.53783 22.53783 22.53783 22.53783     1
  get.synch(urls) 39.50615 39.50615 39.50615 39.50615 39.50615     1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用R进行网页抓取

来自分类Dev

使用R进行网页抓取

来自分类Dev

R,使用xpathSApply抓取网页

来自分类Dev

使用R和Chrome抓取网页

来自分类Dev

网页抓取 - 使用 R 的多个页面

来自分类Dev

如何使用 R 动态执行网页抓取

来自分类Dev

R 网页抓取?

来自分类Dev

如何与子页面并行抓取网页?

来自分类Dev

使用BeautifulSoup抓取网页

来自分类Dev

使用 BeautifulSoup 抓取网页

来自分类Dev

使用R或Python抓取网页和相关的后续页面

来自分类Dev

使用R进行网页抓取-未加载完整的网站数据

来自分类Dev

在R中使用RVest从html网页抓取某些数据

来自分类Dev

R - 网页抓取 - 无法使用 rvest 获取属性值

来自分类Dev

使用 R 进行网页抓取 - 多页表

来自分类Dev

使用 R 进行网页抓取 - 没有 HTML 可见

来自分类Dev

使用BeautifulSoup Python抓取网页

来自分类Dev

如何使用C抓取网页?

来自分类Dev

使用PhantomJS进行网页抓取

来自分类Dev

使用SED进行网页抓取

来自分类Dev

使用Python进行网页抓取

来自分类Dev

使用BeautifulSoup Python抓取网页

来自分类Dev

使用Rcurl进行网页抓取

来自分类Dev

使用PhantomJS进行网页抓取

来自分类Dev

如何使用PHP抓取网页?

来自分类Dev

使用 Scrapy 抓取特定网页

来自分类Dev

使用 BS 的 Python 网页抓取

来自分类Dev

使用 Beautifulsoup 抓取 UEFA 网页

来自分类Dev

使用BeautifulSoup使用Python抓取ASPX网页