You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:10:38