我正在尝试使用rvest
与foreach
和doParallel
同时从网页抓取值。具体来说,我使用名为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'))
}
我(可能是错误地)推断出并行后端是罪魁祸首,但我之前在其他应用程序中使用了很多次,似乎无法找到问题。
答案 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='))
}