Javascript 无法在r中使用phantomjs刮取多个页面

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" "

我正试图从RSelenium控制的phantomjs中获取多个使用javascript生成的地块的县估价员历史财产价值数据。 url中的“paraid”是9位数字的包裹编号。我有一个数据框,其中包含我感兴趣的地块编号列表(总共几百个),但我一直试图让代码在其中的一小部分上工作:

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