1

RSelenium によって制御される phantomjs を使用して、 https: //www.washoecounty.us/assessor/cama/?command=assessment_data&parid=07101001から 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()

これは、ループの 1 回または 2 回の反復では完全に機能しますが、JavaScript によって生成されたデータの保持が突然停止し、エラーが発生します。

 Error in `$<-.data.frame`(`*tmp*`, "apn", value = "00905105") : 
 replacement has 1 row, data has 0 

これは、テーブルが保持されていないため、パーサーが出力ファイル内のテーブルを見つけられないことが原因です。私が選択した実装に問題があるのか​​、それとも問題の原因となっている特定のサイトの特異性があるのか​​はわかりません。私は JavaScript に詳しくないので、使用されているコード スニペットは私が見つけた例から取られています。ご協力ありがとうございます。

以下の答えは完全に機能しました。また、Sys.sleep(5) を $navigate の後に移動して、ページ時間が JavaScript をロードできるようにしました。ループは完了まで実行されています。

4

2 に答える 2

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

これは私に解決策を与えました。これはphantomJSでも機能するはずです。テストして返信するようにお願いします。

于 2016-02-18T03:47:00.627 に答える
0

同様の問題を解決しようとして丸一日を失いました。だから私は他の人が時間と神経を節約するのを助けるために私の学習を共有します..

リモート ドライバーを介して開く、移動する、およびその他のブラウジング アクションを完了するには時間がかかることを理解する必要があると思います。そのため、スクレイピングする予定のページを読み取ったり、何かを実行したりする前に、待機する必要があります。

電話Sys.sleep(5)の後に紹介したところ、問題は解決しました。remDr$navigate(url)

RSelenium でのページの読み込みが完了したかどうかを確認する方法remDr$setTimeout(type = "page load", milliseconds = 10000)で提案されているように、より適切なソリューションを挿入することで構成されているようです が、まだテストしていないようです。

于 2016-03-16T08:44:02.697 に答える