刮取dataTable只获取标题

时间:2016-06-01 23:01:37

标签: r web-scraping

我正试图从the Feds Data Center获得一些薪资数据。有1537个条目可供阅读。我以为我用Chrome的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,数据位于tbody tr inspect screenshot

2 个答案:

答案 0 :(得分:2)

该网站并未明确禁止抓取数据。他们的使用条款有些通用,取自主http://www.fedsmith.com/terms-of-use/站点(因此它似乎是样板)。他们没有对添加任何值的源 free 数据做任何事情。我也同意你应该使用源数据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组件,可以告诉您总数。

浏览器开发者工具的完整是您的朋友,通常可以帮助避免笨拙和笨拙慢慢的浏览器仪表的瑕疵。

答案 1 :(得分:1)

注意:除了处理特定网站的使用条款外,我还将展示如何从使用AJAX技术的类似网站获取数据。

由于网站在 之后加载数据 ,因此网页已加载到浏览器中,仅rvest还不足以解决此类问题。< / p>

要从此网站下载数据,我们需要充当网络浏览器并以编程方式控制浏览器。 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()

因此,在从Selenium获取Html后,我们可以通过rvest处理它。