刮飞溅的网页和加载更多按钮
问题描述:
我试图刮几1801 census pages与splashr
,可能有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个记录,所以我不需要为每个页面点击加载更多。
答
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>
中提取数据,但这样可以帮助您避免第三方依赖。
这很好,谢谢。 –