R:增加我的rvest刮刀的速度?

时间:2017-04-06 18:02:25

标签: r web-scraping rvest

我刚刚开始使用R的rvest库进行搜索。太粗体了,我开始查询3206个子页面,每个子页面都要提取一个字符串。

string to srape

问题是:

持续时间。

我的问题是:

我可以优化我的脚本(下面)以加快执行速度吗?

背景

只为3个整数循环工作正常,但我的脚本现在已经运行了很长时间。我不知道任何Python(我可能会改变,因为我听说有一个名为aiohttp的东西)。如果没有其他办法,我将不胜感激,如果有人可以提供一个好的教程或替代解决方案的链接。

脚本

library(rvest)
library(data.table)
#READ IN HTML
#Link: http://globalenergyobservatory.org/list.php?db=PowerPlants&type=Hydro
hydro <- read_html("http://globalenergyobservatory.org/list.php?db=PowerPlants&type=Hydro")
#GET ATTRIBUTES
attributes <- hydro %>%
  html_nodes("#list a") %>%
  html_attrs()
#WRITE URLs
urls = list()
for (i in 1:3206) {
  da <- unlist(attributes[i])
  dat <- da[1]
  data <- paste("http://www.globalenergyobservatory.org/",dat, sep="")
  urls[[i]] <- data
}
#GET ABSTRACTS
abstracts = list()
for(i in 1:3206) {
  to_use <- read_html(urls[[i]])
  to_use %>%
    html_nodes("#Abstract_Block td") %>%
    html_text() -> to_write
  abstracts[[i]] <- to_write
}

1 个答案:

答案 0 :(得分:5)

所有好评。我也建议你这样做。

library(rvest)
library(data.table)
#READ IN HTML
#Link: http://globalenergyobservatory.org/list.php?db=PowerPlants&type=Hydro
hydro <- read_html("http://globalenergyobservatory.org/list.php?db=PowerPlants&type=Hydro")
#GET ATTRIBUTES
attributes <- paste0("http://www.globalenergyobservatory.org/",
                     unlist(hydro 
                            %>% html_nodes("#list a") 
                            %>% html_attrs())[seq_along(unlist(hydro 
                                                             %>% html_nodes("#list a") 
# YOUR METHOD                                                             %>% html_attrs())) %% 2 > 0])
time = proc.time()
abstracts <- 0
for(i in 1:100) {
  page<-html_session(attributes[i])
  abstracts[i]<-html_nodes(read_html(page),css="#Abstract_Block td") %>% html_text()
}
print(proc.time()-time)


# PROPOSED METHOD
time = proc.time()
library(doSNOW)
library(foreach)
cluster = makeCluster(2, type = "SOCK")
registerDoSNOW(cluster)
abstracts<-function(attributes){
  library(rvest)
  page<-html_session(attributes)
  abstracts<-html_nodes(read_html(page),css="#Abstract_Block td") %>% html_text()
  return(abstracts)
}
big_list<-unlist(foreach(i = 1:100) %dopar% abstracts(attributes[i]))
print(proc.time()-time)
stopCluster(cluster)

对于您的方法,输出如下

user  system elapsed 
6.01    0.31   61.48

对于我的方法

user  system elapsed 
0.26    0.08   16.33 

将计算时间缩短了75%