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

R语言使用rvest遍历URL列表爬取数据存CSV问题求解

问题根因

  • 你的代码存在两个核心错误导致仅返回首个URL的提取结果:
    1. seq(list_url)作用于数据框时会返回列数而非行数,你的list_url仅有1个url列,因此循环仅执行1次,只会处理第一个URL
    2. 即使循环次数正确,你每次迭代都直接给text变量重新赋值,之前的提取结果会被覆盖,无法积累所有URL的结果

修正方案

方案1:修改for循环实现(易理解)

library(rvest)
library(dplyr)

# 1. 初始化结果列表存储所有提取值
result_list <- list()

# 2. 按url列的行数循环,seq_along会返回和url行数一致的序列
for(i in seq_along(list_url$url)) {
  # 加错误处理,避免单个URL请求失败导致整个脚本中断
  tryCatch({
    text <- read_html(list_url$url[i]) %>% 
      html_nodes("tr~ tr+ tr strong") %>% 
      html_text()
    # 存储当前URL的提取结果,同时保留原始URL方便核对
    result_list[[i]] <- data.frame(
      url = list_url$url[i],
      extracted_text = ifelse(length(text) == 0, NA_character_, text)
    )
  }, error = function(e) {
    # 请求失败时返回NA,记录错误URL
    result_list[[i]] <- data.frame(
      url = list_url$url[i],
      extracted_text = NA_character_
    )
  })
}

# 3. 合并所有结果为数据框
result_df <- bind_rows(result_list)

# 4. 导出为CSV文件
write.csv(result_df, "提取结果.csv", row.names = FALSE, fileEncoding = "UTF-8")

方案2:purrr向量化实现(更简洁,R推荐写法)

library(rvest)
library(dplyr)
library(purrr)

result_df <- list_url %>% 
  mutate(extracted_text = map_chr(url, function(u) {
    tryCatch({
      read_html(u) %>% 
        html_nodes("tr~ tr+ tr strong") %>% 
        html_text() %>% 
        {ifelse(length(.) == 0, NA_character_, .)}
    }, error = function(e) NA_character_)
  }))

write.csv(result_df, "提取结果.csv", row.names = FALSE, fileEncoding = "UTF-8")

注意事项

  • 若单个URL对应页面返回多个符合节点的提取结果,可将上述代码中的map_chr/ifelse(length(text)==0)调整为保留多值的逻辑,比如用list存储提取结果后再拆分行
  • 爬取时可适当添加Sys.sleep(1)在两次请求之间休眠1秒,避免请求频率过高被网站拦截

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:57:04