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

使用RSelenium批量爬取报纸存档多页数据循环运行报错求解

R爬虫批量爬取新闻存档修正方案

核心问题定位

原有代码的主要问题集中在以下几点:

  • 浏览器驱动放在循环内重复启动,导致多进程冲突,页面加载异常
  • 内外层循环复用变量名i,导致日期参数被覆盖
  • 出现未定义的remDr0变量,直接调用触发报错
  • 未对每日爬取结果做累加存储,仅保留最后一次运行的部分数据
  • 固定滚动次数的逻辑未适配页面实际加载进度,部分懒加载内容未完全渲染就开始提取数据

可运行实现代码

# 加载依赖包
library(RSelenium)
library(rvest)
library(stringr)
library(dplyr)

# 1. 仅启动一次浏览器驱动,不要放在循环内重复创建
driver <- rsDriver(browser = "firefox", version = "latest")
remDr <- driver[["client"]]
# 隐式等待设置,避免元素未加载就操作
remDr$setImplicitWaitTimeout(10000)

# 2. 生成日期范围与URL列表
start_date <- as.Date("2021-09-30")
end_date <- as.Date("2021-10-02")
date_seq <- seq(start_date, end_date, by = "days")
url_list <- str_c("https://en.trend.az/archive/", date_seq)

# 3. 初始化结果存储列表
all_news <- list()

# 4. 循环爬取每个日期的页面
for (idx in seq_along(url_list)) {
  current_url <- url_list[idx]
  current_date <- date_seq[idx]
  cat("正在爬取:", current_date, "\n")
  
  # 访问页面
  remDr$navigate(current_url)
  Sys.sleep(3)
  
  # 滚动加载全部内容,自适应判断加载完成
  webElem <- remDr$findElement("css", "body")
  last_len <- 0
  # 最多滚动30次,避免死循环
  for (scroll_cnt in 1:30) {
    webElem$sendKeysToElement(list(key = "end"))
    Sys.sleep(2)
    # 统计当前已加载的文章数量
    current_article_cnt <- length(remDr$findElements(using = "css", ".category-article"))
    if (current_article_cnt == last_len) {
      # 数量不再增加,加载完成
      break
    }
    last_len <- current_article_cnt
  }
  
  # 提取页面内容
  page <- read_html(remDr$getPageSource()[[1]])
  
  # 提取所需字段
  article_nodes <- page %>% html_nodes('.category-article')
  headlines <- article_nodes %>% html_node('.article-title') %>% html_text(trim = TRUE)
  times <- article_nodes %>% html_node('.article-date') %>% html_text(trim = TRUE) %>% str_sub(-5)
  categories <- article_nodes %>% html_node('.category') %>% html_text(trim = TRUE)
  
  # 整合为当日数据框
  daily_df <- tibble(
    date = current_date,
    time = times,
    category = categories,
    headline = headlines
  )
  
  # 存入总结果列表
  all_news[[as.character(current_date)]] <- daily_df
  cat(current_date, "爬取完成,共", nrow(daily_df), "条数据\n")
}

# 5. 关闭驱动,清理进程
remDr$close()
driver$server$stop()

# 6. 合并所有日期的数据
final_data <- bind_rows(all_news)
# 验证总数据量
cat("总数据量:", nrow(final_data), "\n")

补充说明

  • 可根据自身网络情况调整Sys.sleep的等待时长,网络较差可适当增加时间保证内容加载完成
  • 如需扩大爬取范围,建议在每次循环后增加1-3秒的随机延迟,避免请求频率过高被网站反爬拦截
  • 如果不想用RSelenium,也可以分析网站的异步请求接口,直接调用接口获取数据,爬取效率会更高

内容的提问来源于stack exchange,提问作者Eugene Bu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:45:02