如何在R函数中循环遍历年份和月份批量抓取新闻数据
问题诊断
你原有代码的问题主要出在以下几处:
- 循环遍历逻辑错误:
for (i in length(years))只会取到years的最后一个值(2021),并没有遍历整个年份序列,正确写法应该是for (i in years),月份循环同理。 - 没有初始化结果容器:
newdf没有预先定义,直接调用rbind会因为对象不存在报错。 - 合并逻辑位置错误:
rbind放在了内层月份循环外,只会把每个年份最后一个月(12月)的结果合并,丢失1-11月的数据。 - 月份格式不匹配:原函数要求传入的月份是带前导零的两位字符串(如
'01'),直接传入数字1-9会导致URL拼接错误,请求返回无效数据。 - 实用优化建议:短时间高频请求谷歌新闻很容易触发反爬限制,建议每次请求后加短暂停顿。
修正后的循环实现
# 若未提前加载依赖包请先运行这两行 library(rvest) library(dplyr) # 你的原有抓取函数 news <- function(term, term2) { html_dat <- read_html(paste0("https://news.google.com/search?q=site%3%2F",term,"%2F",term2,"&hl=en-US&gl=US&ceid=US%3Aen")) news_dat <- data.frame( Title = html_dat %>% html_nodes("a.DY5T1d") %>% html_text() ) return(news_dat) } # 初始化结果数据框 newdf <- data.frame(Title = character()) years <- 2000:2021 months <- 1:12 # 修正后的循环逻辑 for (i in years) { for (j in months) { # 格式化月份为两位字符串,自动补前导零 fmt_month <- sprintf("%02d", j) temp <- news(as.character(i), fmt_month) # 实时合并结果 newdf <- rbind(newdf, temp) # 加1秒停顿防反爬,可根据需要调整时长 Sys.sleep(1) } } # 最终全量新闻标题存储在newdf中
可选高效实现(避免动态rbind的性能问题)
如果抓取数据量较大,动态rbind会随数据量增长越来越慢,可以用purrr包做向量化批量处理:
library(purrr) library(tidyr) # 生成所有年月的组合表 date_grid <- expand.grid(year = 2000:2021, month = 1:12) %>% mutate(month = sprintf("%02d", month)) # 批量抓取并自动合并为统一数据框 all_news <- pmap_dfr(date_grid, function(year, month) { res <- news(year, month) Sys.sleep(1) res })
内容的提问来源于stack exchange,提问作者purple1437
相关产品推荐
相关产品推荐

