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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 22:33:03