2017-10-07 67 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

这很好,谢谢。 –