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
相关产品推荐
相关产品推荐

