在数据框中抓取长度不一致的页面
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
我想从 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