2017-10-07 63 views
1

我試圖刮幾1801 census pagessplashr,可能有0到多個加載更多按鈕(因爲一次加載50個記錄)。此頁面應該有174刮飛濺的網頁和加載更多按鈕

url <- "https://digitalarkivet.no/en/census/district/tf01058443000001" 
doc <- splash("localhost") %>% render_html(url, wait =3) 
html_nodes(doc2, xpath="//h4[not(@class)]/a") %>% length() 
[1] 50 

我試圖載入網址下面更多,但只是再次獲得的第50個記錄。

url2 <- html_nodes(doc, xpath="//div[@class='load-more']") %>% html_attr("data-url") 
[1] "https://digitalarkivet.no/en/census/related/rural-residences/tf01058443000001?page=2" 

請注意,大多數地區有少於50個記錄,所以我不需要爲每個頁面點擊加載更多。

回答

2

Thx嘗試splashr包(我是作者)。

謝天謝地,在這種情況下你不需要它。數據負載,通過它我們在R中可以模仿XHR請求完成:

library(httr) 
library(rvest) 

census_page <- function(district, page=1L) { 

    GET(
    url = "https://digitalarkivet.no", 
    path=sprintf("en/census/related/rural-residences/%s", district), 
    accept_json(), 
    add_headers(
     `User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.45 Safari/537.36", 
     Referer = "https://digitalarkivet.no/en/census/district/tf01058443000001", 
     `X-Requested-With` = "XMLHttpRequest" 
    ), 
    query = list(page=page) 
) -> res 

    stop_for_status(res) 

    res <- content(res) 

    list(
    divs = read_html(res$view), 
    next_page = parse_url(res$nextPage)$query$page 
) 

} 

現在,只需傳遞數據的分區和頁面你想要的:

res <- census_page("tf01058443000001", 1) 

而得到的結果:

str(res, 1) 
## List of 2 
## $ divs  :List of 2 
## ..- attr(*, "class")= chr [1:2] "xml_document" "xml_node" 
## $ next_page: chr "2" 

該函數返回一個list用:

  • divs這是包含<div>是你想
  • next_page的信息的解析的內容可以用來傳遞給函數的另一個呼叫

我沒有嘗試進行到底(即我不知道是否總是會有'下一頁'),您需要自行從<div>中提取數據,但這樣可以幫助您避免第三方依賴。

+0

這很好,謝謝。 –