【问题标题】:Web scraping multiple pages issue网页抓取多个页面问题
【发布时间】:2020-09-13 15:25:57
【问题描述】:

我正在尝试使用 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 页,而是向我提供了四次第一页。

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

【问题讨论】:

  • 非常感谢您的快速回复。你能推荐如何在R中编码吗?我尝试了一些解决方案,但没有一个真正给出相关结果。

标签: r web-scraping rvest


【解决方案1】:

页面使用javascript调用API,可以访问数据,JSON格式,第一页如下:jsonlite::fromJSON("https://api.boliga.dk/api/v2/sold/search/results?searchTab=1&amp;page=1&amp;sort=date-d&amp;zipcodeFrom=1000&amp;zipcodeTo=2499&amp;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)

【讨论】:

  • 非常感谢 - 这太棒了。您能否解释一下这个 API 到底是什么以及您的解决方案为何有效?只是出于好奇 - 我已将您的解决方案标记为有效!
  • 这里有一个非常笼统的解释。数据存储在服务器上的某个数据库中,而不是网页上。加载网页时,网页脚本将通过调用“api.boliga.dk/api/v2...”查询数据库,并将数据作为 JSON 数据结构返回。因此,为了抓取网页,需要例如,直接查询数据库或使请求像 Web 浏览器一样运行并运行 javascript,如 RSelenium 的另一个答案中所述。
【解决方案2】:

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

【讨论】:

  • 感谢您的快速回复。我对 R 比较陌生,所以你知道这段代码在我的 URL 中提取地址的样子吗?
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2016-08-09
相关资源
最近更新 更多