在数据框中抓取长度不一致的页面

Scraping pages with inconsistent lengths in dataframe

我想从 this page 中抓取所有的名字。结果是三列一列。我的代码只有在所有数据都存在时才有效,因此我的错误是:

 Error: Tibble columns must have consistent lengths, only values of length one are recycled:
* Length 20: Columns `huisarts`, `url`
* Length 21: Column `praktijk`

如果数据不存在,我如何让我的代码 运行 但在 tibble 中填充 Na

我的pauzing机器人代码后来用在了抓取功能中:

pauzing_robot <- function (periods = c(0, 1)) {
      tictoc <- runif(1, periods[1], periods[2])
      cat(paste0(Sys.time()), 
          "- Sleeping for ", round(tictoc, 2), "seconds\n")
      Sys.sleep(tictoc)
    }

抓取工具:

library(tidyverse)
library(rvest)

scrape_page <- function(pagina_nummer) {

  page <- read_html(paste0("https://www.zorgkaartnederland.nl/huisarts/pagina", pagina_nummer)) 

  pauzing_robot(periods = c(0, 1.5))

  tibble(

    huisarts = page %>% 
      html_nodes(".media-heading.title.orange") %>% 
      html_text() %>% 
      str_trim(), 

    praktijk = page %>% 
      html_nodes(".location") %>% 
      html_text() %>%
      str_trim(),

    url = page %>% 
      html_nodes(".media-heading.title.orange") %>% 
      html_nodes("a") %>%
      html_attr("href") %>% 
      str_trim() %>% 
      paste0("https://www.zorgkaartnederland.nl", .)
  )
}

总页数445,不过为了举例只抓了三个:

huisartsen <- map_df(sample(1:3), scrape_page)

第 2 页似乎是长度不一致的问题,因为这段代码有效:

huisartsen <- map_df(3:4, scrape_page)

如果可能,请使用 tidyverse 代码。提前致谢。

您需要检索父节点列表

parents <- page %>% html_nodes("li.media")

然后用函数html_node()解析父节点。

tibble(
    huisarts = parents %>% 
      html_node(".media-heading.title.orange") %>% 
      html_text() %>% 
      str_trim(), 

    praktijk = parents %>% 
      html_node(".location") %>% 
      html_text() %>%
      str_trim(),

    url = parents %>% 
      html_node(".media-heading.title.orange a") %>% 
      html_attr("href") %>% 
      str_trim() %>% 
      paste0("https://www.zorgkaartnederland.nl", .)
  ) 

html_node 函数总是 return 一个值,即使它只是一个 NA