用splashr刮网页并加载更多按钮

时间:2017-10-07 16:08:04

标签: r web-scraping rvest

我尝试用splashr抓取一些1801 census pages,其中可能有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条,因此我不需要为每个页面点击加载更多内容。

1 个答案:

答案 0 :(得分:2)

尝试使用splashr包(我是作者)。

谢天谢地,在这种情况下你不需要它。数据加载是通过XHR请求完成的,我们可以模仿R:

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>中提取数据,但这可以帮助您避免第三方依赖。