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

R语言网页爬虫双层循环失效:无法遍历日期与分页

问题描述

我正在爬取约旦的alrai网站,初始爬取页面为https://alrai.com/search?date-from=2004-09-21&pgno=1。我尝试用R实现先遍历日期、再遍历分页(pgno=1,2,3等)的双层循环。仅使用单循环爬取2004-09-21的分页时可正常运行,但添加日期外层循环后,代码仅返回第一页的10条数据,未遍历其他分页及日期。

代码如下:

for (i in seq_along(days)){
for (pagenumber in seq(from = 1, to = 10, by = 1)){
  link = paste("https://alrai.com/search?date-from=",(days[i]), "&pgno=", 
               pagenumber, sep = "")
  page = read_html(link)
} 
}

readlink <- read_html(link)
  
text_title <- readlink %>% 
  html_elements(".font-700") %>%
  html_text2()

article_links <- readlink %>%
  html_elements(".font-700") %>%
  html_attr("href") 
问题分析与修复

你的代码有两个核心问题:

  1. 循环仅覆盖变量未存储数据:双层循环里只是不断更新link和page,但没把每一页的数据留存下来。循环结束后link只保留最后一次循环的结果,后续你又重新读取这个link,等于完全没用到循环里的爬取结果。
  2. 无数据存储容器:没有提前创建列表或数据框来保存每一页的标题和链接,导致爬取的数据全部丢失。

修复后的代码示例:

# 初始化存储结果的列表
result_list <- list()
index <- 1

for (i in seq_along(days)){
  current_date <- days[i]
  for (pagenumber in seq(from = 1, to = 10, by = 1)){
    # 构造请求链接
    link <- paste0("https://alrai.com/search?date-from=", current_date, "&pgno=", pagenumber)
    # 读取页面
    page <- read_html(link)
    
    # 提取当前页的标题和链接
    text_title <- page %>% 
      html_elements(".font-700") %>%
      html_text2()
    
    article_links <- page %>%
      html_elements(".font-700") %>%
      html_attr("href") 
    
    # 将当前页数据存入列表,同时记录日期和页码
    result_list[[index]] <- data.frame(
      date = current_date,
      page = pagenumber,
      title = text_title,
      link = article_links
    )
    
    index <- index + 1
    # 可选:添加延迟,避免请求过于频繁被封
    Sys.sleep(1)
  } 
}

# 将列表合并为一个数据框
final_result <- dplyr::bind_rows(result_list)

关键修改点:

  • 提前创建result_list存储每一页结果,避免数据丢失
  • 在双层循环内直接处理当前页的爬取和数据提取,每处理完一页就存入列表
  • 记录对应日期和页码,方便后续分析
  • 添加Sys.sleep(1)降低请求频率,减少被反爬拦截的风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:01:07