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")
问题分析与修复
你的代码有两个核心问题:
- 循环仅覆盖变量未存储数据:双层循环里只是不断更新
link和page,但没把每一页的数据留存下来。循环结束后link只保留最后一次循环的结果,后续你又重新读取这个link,等于完全没用到循环里的爬取结果。 - 无数据存储容器:没有提前创建列表或数据框来保存每一页的标题和链接,导致爬取的数据全部丢失。
修复后的代码示例:
# 初始化存储结果的列表 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
相关产品推荐
相关产品推荐

