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

R语言使用for循环批量抓取网页多方案报错如何解决?

报错原因与解决方案

第一个报错说明

你收到的read_xml相关报错,根源是提取URL的方式错误:read_csv读取的是tibble格式数据集,news_urls[i, 'url']返回的是1行1列的tibble对象,不是字符串类型的URL,read_html无法识别这类输入,因此抛出错误。
修复方式很简单,提取URL时转为字符即可,比如用pull函数直接提取url列为字符向量:

# 替换原循环内的nyp_url赋值行
nyp_url <- news_urls %>% pull(url) %>% .[i]
# 或者用as.character转换
nyp_url <- as.character(news_urls[i, 'url'])

第二个404报错说明

手动访问链接正常、脚本访问返回404,是网站反爬机制识别到非浏览器请求后返回了错误状态码。另外apply处理tibble列时也可能出现格式异常,导致传入read_html的URL本身不符合要求。

推荐批量抓取方案

使用purrr包的迭代功能实现更稳定的批量抓取,内置错误处理和请求伪装,不会因为单个链接出错导致整个任务中断,参考代码如下:

library(tidyverse)
library(rvest)
library(httr)

# 读取数据集并提取URL为字符向量
news_urls <- read_csv("nyp_data.csv")
url_vec <- pull(news_urls, url)

# 单页面抓取函数:带请求伪装和错误捕获
scrape_nyp <- function(input_url) {
  tryCatch({
    # 伪装为Chrome浏览器请求
    resp <- GET(input_url, user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"))
    # 请求失败直接返回空值
    if (status_code(resp) != 200) return(NA_character_)
    # 解析提取内容
    page_content <- read_html(resp) %>% 
      html_elements(".single__content") %>% 
      html_text2() %>% 
      str_squish() %>% 
      paste(collapse = "")
    return(page_content)
  }, error = function(e) {
    return(NA_character_)
  })
}

# 批量抓取:每两次请求间隔1秒,避免触发反爬限制
all_content <- map_chr(url_vec, ~{
  Sys.sleep(1)
  scrape_nyp(.x)
})

# 抓取结果合并回原数据集
news_urls <- news_urls %>% mutate(article_content = all_content)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:09:00