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

