修改rvest网页爬虫函数:遇无数据时跳过继续执行
解决方案
修正后的爬取函数
原函数存在两个核心问题:一是缺少错误捕获机制,遇到无目标字段或爬取失败的情况会直接中断;二是日期提取逻辑错误(begin和end取了同一个值)。以下是修复后的函数:
library(tidyverse) library(rvest) library(janitor) scraper <- function(package_id) { cat("正在爬取", package_id, "\n") tryCatch({ url <- str_c("https://portal.edirepository.org/nis/metadataviewer?packageid=", package_id) data <- read_html(url) %>% html_elements(".subgroup.onehundred_percent") %>% pluck(1) %>% html_elements(".roweven") %>% html_text2() # 精准提取Begin和End对应的日期内容 begin_date <- data[str_detect(data, "^Begin:")] %>% str_remove("Begin: ") end_date <- data[str_detect(data, "^End:")] %>% str_remove("End: ") # 无匹配字段时返回NA,而非报错 tibble( begin = ifelse(length(begin_date) == 0, NA_character_, begin_date), end = ifelse(length(end_date) == 0, NA_character_, end_date) ) }, error = function(e) { # 捕获所有爬取/解析错误,打印提示并返回NA行 message("处理", package_id, "时出错:", e$message) tibble(begin = NA_character_, end = NA_character_) }) }
替代方案:用safely包装函数
如果不想修改原函数,可使用purrr::safely为函数添加错误防护:
# 包装原函数,出错时返回预设的NA行 safe_scraper <- safely(scraper, otherwise = tibble(begin = NA_character_, end = NA_character_)) # 调用方式调整为: dat2 <- bad_page %>% html_table() %>% pluck(4) %>% clean_names() %>% mutate(across(title, ~ str_squish(str_remove_all(., "\n")))) %>% mutate(date = map(package_id, ~ safe_scraper(.)$result)) %>% unnest(date) %>% select(!c(title,creators))
额外处理(可选)
如果需要完全剔除无有效日期的行,可在unnest后添加过滤:
dat2 <- dat2 %>% filter(!is.na(begin) | !is.na(end))
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

