R语言使用rvest遍历URL列表爬取数据存CSV问题求解
问题根因
- 你的代码存在两个核心错误导致仅返回首个URL的提取结果:
seq(list_url)作用于数据框时会返回列数而非行数,你的list_url仅有1个url列,因此循环仅执行1次,只会处理第一个URL- 即使循环次数正确,你每次迭代都直接给
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
相关产品推荐
相关产品推荐

