用rvest并行读取多个html页面

时间:2016-07-08 00:29:50

标签: r foreach rvest doparallel

我正在尝试使用rvestforeachdoParallel同时从网页抓取值。具体来说,我使用名为TMK的房地产属性标识符从网站上检索房产的人口普查区域编号。

在下面的示例代码中,foreach循环在使用%do%但不在%dopar%下运行时会提供所需的结果(包含道数的矢量)。

require(rvest); require(foreach); require(doParallel)
registerDoParallel(cores = 4)

# sample input values used to generate html
tmklist <- c(91136088, 73006073, 92023027, 45061064)

# read html for each TMK
# DOES NOT PRODUCE DESIRED RESULT WHEN USED WITH %dopar%
tmkhtml <- foreach(i = seq_along(tmklist)) %do% {
  read_html(paste0(paste0('http://gis.hicentral.com/pubwebsite/TMKDetails.aspx?tmk=', tmklist[[i]]),'&lyrLst=0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|lblsaerial2008&unit=0000&address='))
}

# scrape census tract number from html page
# loop returns vector of chr(0) if %dopar% used instead of %do%
tract.num <- list()

for(i in 1:length(tmkhtml)){
  tract.num[[i]] <- html_text(html_nodes(tmkhtml[[i]], '#lblTrackNumber'))   
}

我(可能是错误地)推断出并行后端是罪魁祸首,但我之前在其他应用程序中使用了很多次,似乎无法找到问题。

1 个答案:

答案 0 :(得分:1)

可能是当您尝试使用多个R实例读取每个页面时,所有这些都需要rvest包来使用rvest::read_html。尝试在foreach中加载库,例如:

# read html for each TMK
tmkhtml <- foreach(i = seq_along(tmklist)) %dopar% {
library(rvest)
  read_html(paste0(paste0('http://gis.hicentral.com/pubwebsite/TMKDetails.aspx?tmk=', tmklist[[i]]),'&lyrLst=0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|lblsaerial2008&unit=0000&address='))
}