关于爬虫 retry 机制的思考

news/2024/11/28 12:23:55/文章来源:https://www.cnblogs.com/coldchair/p/18574043

背景:

最近在爬某网站,发现其反爬机制是这样的:

如果一段时间访问次数比较多,就会禁止访问几分钟,然后恢复正常。

对于爬虫端,这其实很难针对写:

发生禁止访问时,爬虫并不知道这是突发性错误(临时网络挂了,过几秒可能就好了),还是资源本身不能访问(永远会 fail),还是网站反爬机制起作用了。

如果能检测反爬虫机制是否生效,倒是很好解决这个问题,但是这不好写(不同网站机制不一样)。

假设我们不能检测反爬虫机制,有没有什么通用的算法策略呢?

如果我们只采用 retry 的方法:
比如说 retry 3 次,但是反爬机制生效的这段时间,怎么都是访问不了的,所以会错过资源。

如果我们采用 sleep + retry 的方法,有 2 个问题:

  1. 不知道要 sleep 多长时间
  2. 如果对每个访问不了资源都 sleep 再 retry,那么每个本身不能访问的资源都会浪费 sleep 时间 * retry 次数

策略:

下面介绍一个我想到的算法策略,可以适配于并发的爬虫程序,效率也比较高:

我们维护一个队列 Q:队列存访问失败的资源,和尝试过的次数。

假设我们有一个爬虫的协程池(并发池),

当某个爬虫访问一个资源失败时,加入队列 Q。
当某个爬虫访问一个资源成功时,挂起协程池(访问完当前资源就清空)。然后 retry 一轮队列 Q。

一轮 retry :
某个资源成功了,pop。
如果队列 Q 里的 head 资源访问次数达到上限,pop。

爬虫任务结束时,如果 Q 不为空,一轮一轮 retry Q,直到 Q 为空。
retry 每一轮之间设置一个间隔(比如说 2 分钟,可以观察之前 fail 到 success 的间隔来设置)

策略需求:
没有 retry 机制时,连续 fail 长度 + 协程池大小 < 连续 success 长度
不然一轮 retry 到中间时,又被反爬了,就会导致队列 Q 的 tail 部分直接尝试次数 + 1。

代码参考:

Codeforces 的 blog 爬虫:
等我上传 github。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842805.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Free5GC源码研究(10) - SMF研究(上)

本文研究Session Management Function (SMF)的功能SMF的概念 对于free5gc各NF的研究来到了最终阶段,只剩SMF和AMF两个功能,是时候回顾一下TS23.501中的这几张网络架构图。首先是这一张经典的非漫游情境下各NF的交互架构:这张图里,核心网所有的NF通过SBI总线相连,本质上就…

jquery计数器动画特效

这是一款jquery计数器动画特效。该jquery计数器动画特效使用bootstrap网格系统进行布局,然后通过jQuery animate方法来制作炫酷的计数器动画特效。在线演示 下载使用方法 在页面中引入jquery,bootstrap.min.css和font-awsome.min.css文件。< link href="dist/boots…

小诚因为金铲铲D不到牌破产啦

小诚因为金铲铲D不到牌破产啦 Description 小诚和他身边的朋友最近好像出了点经济问题…… 已知小诚的人际关际网中包含 n* 个人(小诚也在其中),每个人手上现在有ai元,他们可以彼此之间互相借钱,他们只希望在最后手上恰好有 bi 元 众所周知,欠钱容易借钱难,没借到之前是…

代码精简之路-责任链模式

前言 常说c#、java是面向对象的语言,但我们平时都是在用面向过程的思维写代码,实现业务逻辑像记流水账一样,大篇if else的判断;对业务没有抽象提炼、代码没有分层。随着需求变化、功能逐步拓展、业务逻辑逐渐复杂;代码越来越长、if else嵌套越来越多,代码会变成程序员都厌…

vxe-table 使用表格多选数据、复选框多选

在 vxe-table 启用列多选功能,通过参数 column.type = checkbox 设置类型为多选类型就可以了。 官网:https://vxetable.cn<template><div><vxe-grid v-bind="gridOptions"></vxe-grid></div> </template><script> expor…

【QT】使用Qxlsx读取Excel单元格中函数表达式的结果值

【QT】使用Qxlsx读取Excel单元格中函数表达式的结果值 零、起因 是这样的,目前朋友托我写一款模板生成软件,任务是先把他写的程序文件复制一份出来,然后再根据Excel中对应位置的单元格的值,修改程序文件副本中的某些文件。对于读Excel的需求,经过测试,最终选择Qxlsx这款开…

智慧防汛平台在城市生命线安全建设中的应用

随着城市化进程的加快,城市基础设施的复杂性和互联性不断增强,城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分,通过现代信息技术提升城市防汛应急管理的智能化水平,保障城市安全。智慧防汛平台的核心功能智慧防汛平台通常集成…

初探RocketMQ架构

目录一、概述二、概览2.1、部署架构图1.生产者(Producer)2.消费者(Consumer)3.代理服务器(Broker Server)4.名字服务(Name Server)2.2 名词解释1.主题(Topic)2.标签(Tag)3.消息(Message)4.拉取式消费(Pull Consumer)5.推动式消费(Push Consumer)6.生产者组(…

库存系统:应用层、领域层、对接层的架构设计

大家好,我是汤师爷~ 大厂对候选人的要求较高,即使是20k薪资的岗位,也期望应聘者能够独立承担工作职责。 对于30-40k薪资的岗位,需要具备独立系统设计和小型架构设计的能力。 技术专家和架构师岗位(30-50k以上)要求应聘者具有带领团队、负责大型系统架构的经验,并且在架构…

分布式锁的实现原理

介绍分布式锁的实现原理。作者:来自 vivo 互联网服务器团队- Xu Yaoming介绍分布式锁的实现原理。 一、分布式锁概述 分布式锁,顾名思义,就是在分布式环境下使用的锁。众所周知,在并发编程中,我们经常需要借助并发控制工具,如 mutex、synchronized 等,来保障线程安全。但…

HyperWorks变形域和控制柄方法

变形域和控制柄方法 使用变形域和控制柄方法进行网格变形时,网格模型被分割成若干个变形子域,位于变形域上的控制柄常常用来控制变形域形状的变化。当控制柄移动时,变形域的形状随之变化,进而影响变形域内部节点位置的分布。变形过程中,网格以一种合乎逻辑的方式变化,即靠…

记录Vue Antd 表格RowSelection刷新列表后缓存问题

起因原来的代码//tsx部分 <BaseTableoptions={tableData.options}columns={tableData.columns}data={tableData.data}/>const selectKeys = ref<string[]>([])// 表格配置const handleRowSelection = {onChange: (selectedRowKeys: string[], selectedRows: IS…