2016-06-01 5 views
-1

私はthe Feds Data Centerから給料データを取得しようとしています。読むべき1537の記入項目があります。私はクロームのInspectでテーブルxpathを取得したと思った。しかし、私のコードはヘッダーを返すだけです。私が間違っていることを知りたいです。データテーブルを掻き集めるだけです

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) 

私の望ましい結果は、すべての1537個のエントリを有するデータフレームまたはdata.tableあります。

編集:ここでは、Chromeのからの関連情報は、検査のヘッダがtheadであり、データがtbodytr inspect screenshot

+1

私は、この特定のページが***を読み込んだ後にテーブルを読み込むためにAJAX呼び出しを使用するという事実と関係があると信じています。私はこの問題の解決方法を研究しています。 – pbahr

+0

私はウェブページをダウンロードしようとしました。テーブルの本体は空白です。基本的な方法は機能しません。 – Dave2e

+0

彼らのデータは、[data.gov](http://catalog.data.gov/organization/opm-gov)のデータをはるかに便利な形式で投稿するOPMからのものです。 – 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要求を行い、ページングします。明らかでない場合は、結果をページングするにはiDisplayStart100で増やすことができます。私はcurlconverterパッケージを使ってこれを作った。 dat変数には、合計を示すiTotalDisplayRecordsコンポーネントもあります。ブラウザの開発者ツールの

全体はあなたの友人であり、通常はブラウザ計装のclunkiness &遅&妙を避けるのを助けることができます。

+0

私は利用規約を読み、解釈する方法がわかりません! 'iDisplayLength = 10'を' iDisplayLength = 1537'に変更することで、すべての1537項目を取得することが可能です。 – Jota

+0

いいえ、1ページあたり最大100エントリの「普通の」ハード制限が設定されているようです。どちらのバックエンドライブラリでも、DataTablesに精通しています(builtwith.comはPHPのlibを示唆しています) – hrbrmstr

+0

しかし、一度に100ページしか表示できません。私が誤解していない限り、私は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テクニックを使用している同様のWebサイトからデータを取得する方法。

ウェブサイトは、データをロード後のWebページがブラウザに読み込まれているので、一人で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

ところで、Seleniumを使用すると、次のボタンをクリックして残りのデータを取得することもできます。 – pbahr

+0

実際には、このデータを取得するために[R] Seleniumを使用する必要はありません。 – hrbrmstr

関連する問題