Javascript 无法在r中使用phantomjs刮取多个页面
我正试图从RSelenium控制的phantomjs中获取多个使用javascript生成的地块的县估价员历史财产价值数据。 url中的“paraid”是9位数字的包裹编号。我有一个数据框,其中包含我感兴趣的地块编号列表(总共几百个),但我一直试图让代码在其中的一小部分上工作:Javascript 无法在r中使用phantomjs刮取多个页面,javascript,r,web-scraping,phantomjs,rselenium,Javascript,R,Web Scraping,Phantomjs,Rselenium,我正试图从RSelenium控制的phantomjs中获取多个使用javascript生成的地块的县估价员历史财产价值数据。 url中的“paraid”是9位数字的包裹编号。我有一个数据框,其中包含我感兴趣的地块编号列表(总共几百个),但我一直试图让代码在其中的一小部分上工作: parcel_nums [1] "00905101" "00905102" "00905103" "00905104" "00905105" [6] "00905106" "00905107" "00905108" "
parcel_nums
[1] "00905101" "00905102" "00905103" "00905104" "00905105"
[6] "00905106" "00905107" "00905108" "00905201" "00905202"
我需要在页面上为每个包裹生成的表中刮取数据并保存它。我选择将页面写入文件“output.htm”,然后解析该文件。我的代码如下:
require(plyr)
require(rvest)
require(RSelenium)
require(tidyr)
require(dplyr)
parcel_nums <- prop_attr$APN[1:10] #Vector of parcel numbers
pJS <- phantom()
remDr <- remoteDriver(browserName = "phantomjs")
remDr$open()
result <- remDr$phantomExecute("var page = this;
var fs = require(\"fs\");
page.onLoadFinished = function(status) {
var file = fs.open(\"output.htm\", \"w\");
file.write(page.content);
file.close();
};")
for (i in 1:length(parcel_nums)){
url <- paste("https://www.washoecounty.us/assessor/cama/?command=assessment_data&parid=",
parcel_nums[i], sep = "")
Sys.sleep(5)
emDr$navigate(url)
dat <- read_html("output.htm", encoding = "UTF-8") %>%
html_nodes("table") %>%
html_table(, header = T)
df <- data.frame(dat)
#assign parcel number to panel
df$apn <- parcel_nums[i]
#on first iteratation initialize final data frame, on sebsequent iterations append the final data frame
ifelse(i == 1, parcel_data <- df, parcel_data <- rbind(parcel_data, df))
}
remDr$close
pJS$stop()
require(plyr)
要求(rvest)
需要(硒)
需要(三年)
需要(dplyr)
地块数量<代码>要求(plyr)
要求(rvest)
需要(硒)
需要(三年)
需要(dplyr)
地块数量<代码>要求(plyr)
要求(rvest)
需要(硒)
需要(三年)
需要(dplyr)
parcel_nums我花了整整一天的时间试图解决一个类似的问题。因此,我分享我的学习,帮助他人节省时间和精力
我想我们需要了解,通过远程驱动程序打开、导航和其他浏览操作需要时间才能完成。
因此,我们必须等待,然后再尝试阅读或做任何事情的网页上,我们期待刮
当我在remDr$navigate(url)
调用之后引入Sys.sleep(5)
时,我的问题就解决了
似乎一个更简洁的解决方案是按照建议插入一个remDr$setTimeout(type=“page load”,millides=10000)
,但尚未对其进行测试。我花了整整一天的时间试图解决类似的问题。因此,我分享我的学习,帮助他人节省时间和精力
我想我们需要了解,通过远程驱动程序打开、导航和其他浏览操作需要时间才能完成。
因此,我们必须等待,然后再尝试阅读或做任何事情的网页上,我们期待刮
当我在remDr$navigate(url)
调用之后引入Sys.sleep(5)
时,我的问题就解决了
似乎一个更简洁的解决方案是插入一个remDr$setTimeout(type=“page load”,millides=10000)
,正如在中建议的那样,但尚未对其进行测试。我运行了您的代码,但收到一个错误:“code”(RCurl调用中未定义的错误。queryRD中的错误(粘贴0(serverURL,“/session/”,sessionInfo$id,“/url”),:)忽略最后一条注释。我在$open命令后添加了Sys.sleep,错误消失。我运行了您的代码,但收到一个错误:“code”(RCurl调用中未定义的错误。queryRD中的错误(paste0(serverURL,“/session/”,sessionInfo$id,“/url”),:)忽略最后一条评论。我在$open命令后添加了Sys.sleep,错误消失。同意。我发现在导航后也需要包含Sys.sleep。所需时间可能取决于正在刮取的页面,在检查页面加载usi所用的时间后,我能够将每页的等待时间缩短到3秒ng chrome的开发工具。下次需要刮取时,我将尝试您的替代解决方案。同意。我发现在导航后也有必要包含Sys.sleep。所需时间可能取决于刮取的页面,在检查页面加载所用的时间后,我能够将每页的等待时间缩短到3秒chrome的开发工具。下次我需要清理时,我会尝试你的替代解决方案。
Error in `$<-.data.frame`(`*tmp*`, "apn", value = "00905105") :
replacement has 1 row, data has 0
require(plyr)
require(rvest)
require(RSelenium)
require(tidyr)
require(dplyr)
parcel_nums <- prop_attr$APN[1:10] #Vector of parcel numbers
#pJS <- phantom()
remDr <- remoteDriver()
remDr$open()
# #result <- remDr$executeScript("var page = this;
# var fs = require(\"fs\");
# page.onLoadFinished = function(status) {
# var file = fs.open(\"output.htm\", \"w\");
# file.write(page.content);
# file.close();
# };")
#length(parcel_nums)
for (i in 1:length(parcel_nums)){
url <- paste("https://www.washoecounty.us/assessor/cama/?command=assessment_data&parid=",
parcel_nums[i], sep = "")
Sys.sleep(5)
remDr$navigate(url)
doc <- htmlParse(remDr$getPageSource()[[1]])
doc_t<-readHTMLTable(doc,header = TRUE)$`NULL`
df<-data.frame(doc_t)
#assign parcel number to panel
df$apn <- parcel_nums[i]
#on first iteratation initialize final data frame, on sebsequent iterations append the final data frame
ifelse(i == 1, parcel_data <- df, parcel_data <- rbind(parcel_data, df))
}
remDr$close