如何在rvest中结合Sys.sleep实现每爬200个URL后暂停2分钟
爬取方案实现
核心思路
将URL按每200个分组,每组爬取完成后休眠2分钟;同时加入错误捕获机制,避免单个URL爬取失败中断整个流程。
代码实现
首先加载所需依赖包:
library(rvest) library(dplyr) library(purrr)
假设你的URL数据存储在名为url_tbl的tibble中,URL列名为url,执行以下步骤:
- 拆分URL分组
# 按每200个URL为一组拆分数据 url_groups <- url_tbl %>% mutate(group_id = (row_number() - 1) %/% 200) %>% group_split(group_id)
- 循环爬取并执行休眠
# 初始化总结果容器 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
相关产品推荐
相关产品推荐

