2016-02-17 8 views
1

Я пытаюсь очистить данные оценщика графства от исторических значений свойств для нескольких участков, сгенерированных с использованием javascript от https://www.washoecounty.us/assessor/cama/?command=assessment_data&parid=07101001, используя phantomjs, управляемый RSelenium. «paraid» в URL-адресе - 9-значный номер отправления. У меня есть dataframe, содержащий список номеров посылок, которые меня интересуют (в общей сложности несколько сотен), но были попытки сделать код работать на небольшое подмножество тех:Невозможно очистить несколько страниц с помощью phantomjs в r

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() 

Это будет работать идеально подходит для одной или двух итераций цикла, но он внезапно прекращает сохранение данных, полученных с помощью JavaScript и выдает ошибку:

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

который объясняется тем, что синтаксический анализатор не находит таблицу в выходном файле, потому что она не сохраняется. Я не уверен, есть ли проблема с реализацией, которую я выбрал, или если есть какая-то идиосипия конкретного сайта, вызывающего проблему. Я не знаком с JavaScript, поэтому используемый фрагмент кода берется из примера, который я нашел. Спасибо за любую помощь.

Ответ на этот вопрос работал отлично. Я также переместил Sys.sleep (5) после $ navigate, чтобы позволить странице загружать javascript. Теперь цикл завершается.

ответ

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 

Это дало мне решение. И это должно работать с фантомом. Я прошу вас проверить и ответить.

+0

Я запустил ваш код, но получаю сообщение об ошибке: 'code' (неопределенная ошибка в вызове RCurl. Ошибка в queryRD (paste0 (serverURL, "/ session /", sessionInfo $ id, "/ url"),:) –

+0

Игнорировать этот последний комментарий. Я добавил Sys.sleep после команды $ open, и ошибка исчезла. –

0

Я потерял целый день, пытаясь решить подобную проблему. Поэтому я делюсь своим обучением, чтобы помочь другим сэкономить время и нервы.

Я думаю, нам нужно понять, что для открытия, навигации и других действий просмотра через удаленный драйвер требуется время для завершения. Таким образом, мы должны подождать, прежде чем пытаться читать или делать что-либо на страницах, которые мы ожидаем, чтобы очистить.

Мои проблемы были решены, когда я представил Sys.sleep(5) после вызова remDr$navigate(url).

Похоже, что более аккуратное решение состоит из вставки remDr$setTimeout(type = "page load", milliseconds = 10000), как предложено в how to check if page finished loading in RSelenium, но еще не проверило его.

+0

Согласен. Я обнаружил, что после навигации необходимо также включить Sys.sleep. зависит от того, какая страница была очищена, и я смог довести ожидание до 3 секунд на страницу после проверки того, как долго страница загружалась с помощью инструментов разработчика хром. В следующий раз я попробую альтернативное решение, которое мне нужно будет очистить. –