网站抓取多页问题

时间:2020-05-26 18:14:21

标签: r web-scraping rvest

我正在尝试使用R代码从以下站点抓取前4页用于教育目的:

https://www.boliga.dk/salg/resultater?searchTab=1&page=3&sort=date-d&zipcodeFrom=1000&zipcodeTo=2499&street=

{r}
library(rvest)
library(purrr)
library(tidyverse)

url_base <- "https://www.boliga.dk/salg/resultater?searchTab=1&page=%d&sort=date-d&zipcodeFrom=1000&zipcodeTo=2499&street="

map_df(1:4,function(i){
  page <- read_html(sprintf(url_base,i))

  data.frame(Address = html_text(html_nodes(page,".font-weight-bolder.text-left")))
}) -> Address_map
View(Address_map)

此代码的唯一问题是它实际上并没有显示前4页,而是为我提供了4次首页。

希望您能帮助解决此小问题。

2 个答案:

答案 0 :(得分:2)

该页面使用javascript调用API,您可以访问JSON格式的数据,例如第一页:jsonlite::fromJSON("https://api.boliga.dk/api/v2/sold/search/results?searchTab=1&page=1&sort=date-d&zipcodeFrom=1000&zipcodeTo=2499&street=")

要将所有4页放在一起,请尝试以下操作:

library(dplyr)
library(jsonlite)

url_base <- "https://api.boliga.dk/api/v2/sold/search/results?searchTab=1&page=%d&sort=date-d&zipcodeFrom=1000&zipcodeTo=2499&street="

Address_map <-lapply(1:4,function(i){
  print(i)
  # pause to prevent attacking the server
  Sys.sleep(2)
  #retrieve the results data frame from the returned data structure
  fromJSON(sprintf(url_base, i))$result
}) 

#bind everything together
answer <- bind_rows(Address_map)

答案 1 :(得分:0)

看看如果将sprintf(url_base,2)的结果粘贴到浏览器中会发生什么,它将在表1上加载网站。因此,我认为您无法使用rvest抓取此数据,您需要像RSelenium这样的包抓取这些数据。使用RSelenium,您可以访问网站,然后移至第二个表格,等等。