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

R语言批量爬取800+条CNN RSS新闻链接报404错误如何解决?

问题原因分析
  • CNN的RSS链接属于302跳转链接,你使用的http开头的链接会被CNN强制重定向到https协议,单条请求时触发概率低,批量请求时大量跳转请求会触发反爬机制,返回404状态码
  • 提取url的代码存在格式问题:urls <- cnn_data[,4]如果是tibble格式的数据集,返回的是单列数据框而非字符向量,用apply处理时会传入非标准url格式,导致请求错误
  • 部分RSS链接对应的新闻可能已经下架,本身为无效链接,需要跳过这类错误避免整个程序中断
修复后的代码方案
# 加载依赖包
library(rvest)
library(dplyr)
library(purrr)

# 1. 提取url为字符向量,统一替换http为https避免跳转错误
urls <- cnn_data[[4]] %>% 
  as.character() %>% 
  gsub("^http://", "https://", .)

# 2. 自定义带错误捕获、请求延迟的读页函数
safe_read_html <- function(url, delay = 1) {
  # 每次请求前添加延迟,避免触发反爬规则,网络差可把delay调到2-3
  Sys.sleep(delay)
  # 捕获请求错误,失败返回NA不中断批量运行
  tryCatch({
    read_html(url, options = "HUGE")
  }, error = function(e) {
    message(paste("请求失败,url:", url, "错误信息:", e$message))
    return(NA)
  })
}

# 3. 批量读取页面
url_xml <- map(urls, ~safe_read_html(.x, delay = 1))

# 4. 优化正文提取函数,添加错误捕获
textScraper <- function(x) {
  if (is.na(x)) return(NA)
  tryCatch({
    x %>% 
      html_elements(".Article__body p") %>% 
      html_text2() %>% 
      paste(collapse = "\n\n")
  }, error = function(e) {
    return(NA)
  })
}

# 5. 批量提取正文存入原数据集
cnn_data$full_article <- map_chr(url_xml, textScraper)
额外优化建议
  • 可以把800条链接拆分成多组,每组爬取完成后暂停3-5分钟,进一步降低被反爬拦截的概率
  • 爬取完成后可以筛选full_article为NA的行,手动验证对应url是否有效,无效链接直接剔除即可

内容的提问来源于stack exchange,提问作者monete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:36:03