我尝试用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条,因此我不需要为每个页面点击加载更多内容。
答案 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>
中提取数据,但这可以帮助您避免第三方依赖。