2016-06-01 3 views
-1

Я пытаюсь получить некоторые данные о зарплате от the Feds Data Center. Есть 1537 записей для чтения. Я думал, что получил таблицу xpath с Chrome Inspect. Однако мой код возвращает только заголовок. Я хотел бы знать, что я делаю неправильно.Скребок данныхТаблица получает только заголовок

library(rvest) 
url1 = 'http://www.fedsdatacenter.com/federal-pay-rates/index.php?n=&l=&a=CONSUMER+FINANCIAL+PROTECTION+BUREAU&o=&y=2016' 
read_html(url1) %>% html_nodes(xpath="//*[@id=\"example\"]") %>% 
html_table() 

я получаю только (одинокий) заголовок:

[[1]] 
[1] Name  Grade  Pay Plan Salary  Bonus  Agency  Location 
[8] Occupation FY   
<0 rows> (or 0-length row.names) 

Моего желаемый результат представляет собой кадр данных или data.table со всеми 1537 записями.

Edit: Вот соответствующая информация от Хрома инспектировать, заголовок в thead и данных в tbodytr inspect screenshot

+1

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

+0

Я попытался загрузить веб-страницу и сломать это. Тело таблицы пустое. Основные методы не будут работать. – Dave2e

+0

Их данные поступают от OPM, который размещает свои данные на [data.gov] (http://catalog.data.gov/organization/opm-gov) в гораздо более удобных форматах. – alistaire

ответ

2

Сайт не запрещает четкие данные. Их Условия использования несколько типичны и взяты с основного сайта http://www.fedsmith.com/terms-of-use/ (так что он выглядит как шаблон). Они ничего не делают с источником бесплатно данные, которые добавляют любое значение. Я также согласен, что вы должны просто использовать исходные данные http://www.opm.gov/data/Index.aspx?tag=FedScope vs полагаться на этот сайт.

Но ...

Он также не требует использования RSelenium.

library(httr) 
library(jsonlite) 

res <- GET("http://www.fedsdatacenter.com/federal-pay-rates/output.php?n=&a=&l=&o=&y=&sEcho=2&iColumns=9&sColumns=&iDisplayStart=0&iDisplayLength=100&mDataProp_0=0&mDataProp_1=1&mDataProp_2=2&mDataProp_3=3&mDataProp_4=4&mDataProp_5=5&mDataProp_6=6&mDataProp_7=7&mDataProp_8=8&iSortingCols=1&iSortCol_0=0&sSortDir_0=asc&bSortable_0=true&bSortable_1=true&bSortable_2=true&bSortable_3=true&bSortable_4=true&bSortable_5=true&bSortable_6=true&bSortable_7=true&bSortable_8=true&_=1464831540857") 

dat <- fromJSON(content(res, as="text")) 

Он отправляет запрос XHR на данные и выгружается. Если это неясно, вы можете увеличить его до iDisplayStart на 100. Я сделал это, используя мой пакет curlconverter. Переменная dat также имеет компонент iTotalDisplayRecords, который сообщает об итогах.

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

+0

Угадайте, я не уверен, как читать и интерпретировать условия использования! Можно получить все 1537 записей, изменив 'iDisplayLength = 10' на' iDisplayLength = 1537'. – Jota

+0

Нет, похоже, они установили «нормальный» жесткий предел в 100 записей на странице. Что больше связано с какой-либо библиотекой, которую они использовали, что является подходом DataTables (builtwith.com предлагает несколько PHP lib) – hrbrmstr

+0

Да, вы можете отображать только 100 на странице одновременно. Если я не ошибаюсь, я могу получить все 1537 записей с http://www.fedsdatacenter.com/federal-pay-rates/output.php?n=&a=CONSUMER%20FINANCIAL%20PROTECTION%20BUREAU&l=&o= & y = 2016 & sEcho = 2 & iColumns = 9 & sColumns = & iDisplayStart = 0 & iDisplayLength = 1537' – Jota

1

Примечание: Помимо работы с Условиями использования конкретного веб-сайта, я буду показывать как получить данные с похожих сайтов, которые используют методы AJAX.

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

Для того, чтобы скачать данные с этого сайта, нам необходимо действовать как веб-браузер и управлять браузером программным путем. Selenium и RSelenium пакет может помочь нам в этом.

#Loading package, downloading(if needed) and starting the Server 
library(RSelenium) 
RSelenium::checkForServer()  
RSelenium::startServer() 

#Starting the browser, so we see what's happening 
remDr <- remoteDriver(remoteServerAddr = "localhost" 
         , port = 4444 
         , browserName = "firefox" 
) 

#navigating to the website 
remDr$open() 
remDr$getStatus() 
remDr$navigate(url1) 

# Find table 
elem <- remDr$findElement(using = "id", "example") 

# Read its HTML 
elemHtml <- elem$getElementAttribute("outerHTML")[[1]] 

# Read HTML into rvest objects 
htmlObj <- read_html(elemHtml) 
htmlObj %>% html_table() 

Таким образом, после получения Html от селена, мы можем иметь дело с ним через rvest.

+0

BTW, используя Selenium, вы можете нажать следующую кнопку и получить остальную часть данных. – pbahr

+0

Мы не должны использовать [R] Selenium для доступа к этим данным. – hrbrmstr

Смежные вопросы