使用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
相关产品推荐
相关产品推荐

