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

Nai*_*baf 3 r web-scraping rvest

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

绳索

问题是:

持续时间.

我的问题是:

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

背景:

仅仅为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
}
Run Code Online (Sandbox Code Playgroud)

Bha*_*ath 7

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

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)
Run Code Online (Sandbox Code Playgroud)

对于您的方法,输出如下

user  system elapsed 
6.01    0.31   61.48
Run Code Online (Sandbox Code Playgroud)

对于我的方法

user  system elapsed 
0.26    0.08   16.33 
Run Code Online (Sandbox Code Playgroud)

将计算时间缩短了75%左右