Проблема с парсингом нескольких страниц - PullRequest
2 голосов
/ 26 мая 2020

Я пытаюсь очистить первые 4 страницы со следующего сайта в образовательных целях, используя код R:

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 страницы, а вместо этого предоставляет мне первую страницу четыре раза.

Надеюсь, вы поможете решить эту небольшую проблему.

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Страница использует 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)
0 голосов
/ 26 мая 2020

Посмотрите, что произойдет, если вы вставите результат sprintf(url_base,2) в браузер, он загрузит веб-сайт в таблицу 1. Поэтому я думаю, что вы не можете очистить эти данные с помощью rvest, вам нужен пакет вроде RSelenium для очистки этих данных . С помощью RSelenium вы можете получить доступ к веб-сайту, а затем перейти ко второй таблице et c.

...