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

如何在rvest中结合Sys.sleep实现每爬200个URL后暂停2分钟

爬取方案实现

核心思路

将URL按每200个分组,每组爬取完成后休眠2分钟;同时加入错误捕获机制,避免单个URL爬取失败中断整个流程。

代码实现

首先加载所需依赖包:

library(rvest)
library(dplyr)
library(purrr)

假设你的URL数据存储在名为url_tbl的tibble中,URL列名为url,执行以下步骤:

  1. 拆分URL分组
# 按每200个URL为一组拆分数据
url_groups <- url_tbl %>% 
  mutate(group_id = (row_number() - 1) %/% 200) %>% 
  group_split(group_id)
  1. 循环爬取并执行休眠
# 初始化总结果容器
final_results <- tibble()

# 遍历每个分组
for (group_idx in seq_along(url_groups)) {
  current_group <- url_groups[[group_idx]]
  
  # 处理当前组内所有URL,捕获爬取错误
  group_data <- map_dfr(current_group$url, function(target_url) {
    tryCatch({
      # 读取网页内容
      page_content <- read_html(target_url)
      # 提取.verified元素的href属性
      verified_href <- page_content %>% 
        html_element(".verified") %>% 
        html_attr("href")
      # 返回单条结果
      tibble(url = target_url, verified_href = verified_href)
    }, error = function(e) {
      # 爬取失败时记录错误信息
      tibble(url = target_url, verified_href = NA_character_, error_info = e$message)
    })
  })
  
  # 合并当前组结果到总数据集
  final_results <- bind_rows(final_results, group_data)
  
  # 非最后一组爬取完成后,休眠2分钟(可加入随机波动降低被识别风险)
  if (group_idx != length(url_groups)) {
    message(sprintf("第 %d 组爬取完成,休眠2分钟...", group_idx))
    # 可选:用110-130秒的随机时间替代固定120秒,更贴近人类行为
    # Sys.sleep(sample(110:130, 1))
    Sys.sleep(120)
  }
}

额外优化建议

  • 给read_html添加浏览器UA标识,模拟正常浏览器请求:
    page_content <- read_html(target_url, user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
    
  • 若目标网站反爬严格,可在单个URL爬取后加入1-3秒的随机小延迟,配合分组休眠进一步降低封禁概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:09:19