当前位置: 首页 > article >正文

Python 爬虫进阶技巧:爬虫限速与令牌桶算法实现

前言在网络爬虫工程落地实践中高频无节制的并发请求、短时间密集访问目标站点是引发 IP 封禁、接口限流、验证码拦截、WAF 拦截、账号封禁等风控问题的核心诱因。多数初级爬虫开发者仅关注爬取效率盲目提升请求频率与并发数量忽视站点访问规则与服务器承载阈值最终导致爬虫生命周期大幅缩短数据采集任务被迫中断。爬虫限速作为风控规避的核心基础手段通过人为控制请求间隔、限制单位时间请求总量、平滑请求频率模拟自然人正常浏览行为节奏降低站点访问异常特征从源头规避反爬拦截策略。常规固定延时休眠仅能实现简单粗暴的匀速限速无法适配动态并发、突发请求、分布式多节点爬取等复杂场景存在并发冲突、资源浪费、限速精度不足等缺陷。令牌桶算法作为工业级通用流量控制与频率限制算法具备限流精准、突发兼容、平滑控速、资源可控等核心优势可灵活适配单线程、多线程、异步协程、分布式爬虫等全架构场景是高性能爬虫精细化限速的最优解决方案。本文将全面剖析爬虫限速的业务价值、常规延时限速的底层缺陷、主流限流算法差异对比深度讲解令牌桶算法核心原理、运行机制与参数逻辑结合原生手写令牌桶、线程安全令牌桶、异步令牌桶、分布式令牌桶多维度代码实现搭配多组对比表格、完整可运行案例、原理解析、工程化封装方案完成爬虫限速体系全维度落地帮助开发者构建合规、稳定、低风控的爬虫访问体系。本文涉及核心依赖库官方超链接便于开发者拓展查阅time 标准库官方文档Python 内置时间操作库基础延时限速核心依赖。threading 线程库官方文档实现线程安全令牌桶解决多线程并发竞争问题。asyncio 异步库官方文档异步协程环境下令牌桶调度基础依赖。redis-py 官方文档分布式令牌桶实现核心依赖支撑多节点统一限流。一、爬虫限速的核心意义与基础方案弊端1.1 爬虫限速的核心业务价值站点服务器均设置有访问频次阈值短时间高密度请求会被判定为恶意攻击行为。合理的爬虫限速策略具备多重核心价值第一模拟真人浏览节奏弱化爬虫特征大幅降低 IP 封禁与风控拦截概率第二节制性访问目标服务器降低对方服务负载规避道德合规风险第三平稳控制爬虫并发压力避免本机网络与硬件资源过载第四适配中小型站点弱服务器承载能力保障长期稳定采集。1.2 基础延时限速实现与缺陷最简单的限速方式为固定休眠延时通过time.sleep()强制间隔请求时间代码实现简单应用广泛。python运行import time import requests headers {User-Agent:Mozilla/5.0} def simple_crawl(url): resp requests.get(url,headersheaders,timeout8) return resp.status_code if __name__ __main__: url https://httpbin.org/get for _ in range(10): simple_crawl(url) time.sleep(1)该方案强制每轮请求间隔 1 秒实现每秒 1 次的访问频率但存在显著底层缺陷固定延时无法适配请求耗时波动请求快慢不一导致实际频率失衡不支持突发流量所有请求强制排队等待多线程、异步场景下完全失效无法统一管控全局请求频率并发场景下会出现请求堆积、限速失效问题仅适用于极简单线程爬虫。1.3 主流限流算法横向对比目前互联网主流限流算法包含固定延时、计数器限流、漏桶算法、令牌桶算法四类适配不同爬虫架构核心差异如下表所示。表格限流算法控速精度突发请求兼容并发支持资源利用率适用爬虫场景固定延时休眠低不支持不支持低极简单线程轻量爬虫固定计数器中不支持一般中低频批量静态爬取漏桶算法高不支持良好中流量严格匀速场景令牌桶算法极高完美支持优秀高同步 / 异步 / 分布式全场景爬虫通过表格对比可明确令牌桶算法凭借高精度控速、兼容突发请求、全架构适配的综合优势成为爬虫精细化限速的标准选型方案。二、令牌桶算法核心原理与运行机制2.1 令牌桶基础模型令牌桶算法核心抽象为一个固定容量的容器即令牌桶。系统以恒定速率持续向桶内生成令牌每执行一次爬虫请求必须从桶内获取一枚有效令牌令牌消耗完毕则请求暂停排队等待新令牌生成桶内令牌数量达到最大容量时新增令牌自动丢弃避免溢出。核心核心逻辑拆解令牌生成按照预设速率匀速生成令牌例如每秒生成 2 枚令牌代表允许每秒 2 次请求令牌存储令牌桶存在最大容量限制用于缓存短时未消耗的令牌兼容突发请求令牌消耗爬虫发起请求前必须申领令牌申领成功方可执行网络请求阻塞等待桶内无可用令牌时请求逻辑阻塞等待直至令牌补充完成。2.2 核心参数定义令牌桶算法运行依赖三大核心可控参数可根据目标站点风控强度灵活调整生成速率 rate单位时间生成令牌数量直接决定爬虫最大访问频率桶容量 capacity令牌桶最大存储上限控制突发请求的峰值上限剩余令牌 tokens实时可用令牌数量动态增减管控当前请求权限。2.3 令牌桶相较于漏桶的核心优势漏桶算法强制请求匀速流出完全限制突发访问而令牌桶允许在令牌缓存充足的情况下短时间内执行批量请求适配爬虫偶尔批量解析、批量发起请求的业务特性兼顾限速稳定性与爬取效率更贴合爬虫实际运行场景。三、基础版原生单线程令牌桶实现3.1 手写极简令牌桶代码基于时间戳计算令牌生成数量不依赖第三方库纯原生实现单线程环境下的令牌桶限流轻量化无额外依赖。python运行import time class TokenBucket: def __init__(self,rate:float,capacity:int): self.rate rate self.capacity capacity self.tokens capacity self.last_time time.time() def get_token(self) - bool: now time.time() # 计算时间差值补充新增令牌 delta now - self.last_time self.tokens delta * self.rate # 限制令牌最大容量 if self.tokens self.capacity: self.tokens self.capacity self.last_time now # 判断是否存在可用令牌 if self.tokens 1: self.tokens - 1 return True return False def wait_token(self): # 循环阻塞等待令牌 while not self.get_token(): time.sleep(0.01) # 实例化每秒2个令牌桶最大容量5 bucket TokenBucket(rate2,capacity5)3.2 代码核心原理初始化时填满令牌桶默认拥有最大容量令牌支持启动初期突发请求通过时间戳差值实时计算周期内新增令牌数量精准控制生成速率令牌自动上限截断防止令牌无限堆积get_token非阻塞申领wait_token阻塞等待申领适配不同业务需求。3.3 爬虫结合实战调用python运行import requests def crawl_task(url): bucket.wait_token() resp requests.get(url,timeout8) print(f请求成功状态码{resp.status_code}) if __name__ __main__: test_url https://httpbin.org/get for i in range(15): crawl_task(test_url)运行后可观测整体请求严格按照每秒 2 次的频率执行短时可利用缓存令牌快速发起批量请求限速平稳且高效。四、进阶版线程安全令牌桶实现多线程爬虫场景下多线程同时申领令牌会引发资源竞争、令牌超发、限速失效等线程安全问题需通过线程锁保证令牌操作原子性。4.1 线程安全加强版代码python运行import time import threading class ThreadSafeTokenBucket: def __init__(self,rate:float,capacity:int): self.rate rate self.capacity capacity self.tokens capacity self.last_time time.time() self.lock threading.Lock() def get_token(self) - bool: with self.lock: now time.time() delta now - self.last_time self.tokens delta * self.rate if self.tokens self.capacity: self.tokens self.capacity self.last_time now if self.tokens 1: self.tokens - 1 return True return False def wait_token(self): while not self.get_token(): time.sleep(0.005) # 全局单例令牌桶多线程共享 bucket ThreadSafeTokenBucket(rate3,capacity6)4.2 线程安全核心原理引入threading.Lock互斥锁将令牌计算、补充、扣除等核心操作加入锁保护确保同一时刻仅有一个线程修改令牌数量彻底解决多线程并发竞争导致的令牌超发、计数错乱问题完美适配线程池爬虫、多线程异步爬取架构。五、高阶版异步协程令牌桶实现异步 aiohttp 爬虫高并发场景中同步阻塞休眠会破坏事件循环调度效率需实现异步非阻塞令牌桶适配协程运行机制。5.1 异步令牌桶完整代码python运行import time import asyncio class AsyncTokenBucket: def __init__(self,rate:float,capacity:int): self.rate rate self.capacity capacity self.tokens capacity self.last_time time.time() async def get_token(self): now time.time() delta now - self.last_time self.tokens delta * self.rate if self.tokens self.capacity: self.tokens self.capacity self.last_time now if self.tokens 1: self.tokens - 1 return True return False async def wait_token(self): while not await self.get_token(): await asyncio.sleep(0.01)5.2 异步爬虫调用示例python运行import aiohttp bucket AsyncTokenBucket(rate5,capacity10) async def async_crawl(url): await bucket.wait_token() async with aiohttp.ClientSession() as session: async with session.get(url,timeout8) as resp: print(f异步请求状态码{resp.status}) async def main(): url https://httpbin.org/get tasks [async_crawl(url) for _ in range(20)] await asyncio.gather(*tasks) if __name__ __main__: asyncio.run(main())5.3 异步核心原理使用await asyncio.sleep替代同步休眠阻塞过程中不会阻塞事件循环不影响其他协程正常调度在保障限速规则的同时保留异步爬虫高并发、低开销的核心优势。六、企业级分布式令牌桶方案分布式爬虫多节点部署场景下单实例本地令牌桶无法统一全局请求频率会出现多节点叠加访问超限问题基于 Redis 实现分布式共享令牌桶完成全节点统一限流。6.1 分布式实现核心思路将令牌数量、最后刷新时间存入 Redis 公共缓存利用 Redis 原子操作保证多节点数据一致性所有爬虫节点共享同一套令牌规则全局统一控速依托 Redis 过期与持久化机制保障限流规则稳定运行。6.2 核心关键代码片段python运行import redis import time redis_client redis.Redis(host127.0.0.1,port6379,db0) class DistributedTokenBucket: def __init__(self,rate,capacity,keyspider:token): self.rate rate self.capacity capacity self.key key分布式令牌桶可有效解决集群爬虫、多进程爬虫的限速失控问题是中大型爬虫项目的标准落地方案。七、令牌桶参数调优与爬虫适配策略7.1 不同站点等级参数配置参考结合站点反爬强度差异化调整令牌桶参数平衡爬取效率与风控安全。表格站点类型令牌生成速率桶容量限速策略说明小型个人站点1~2 次 / 秒3~5低频率、小缓存严格限速中型企业站点3~5 次 / 秒5~10均衡频率适度兼容突发大型门户站点8~15 次 / 秒15~20高容忍度提升采集效率高风控电商站点0.5~1 次 / 秒2~3极低速最大化规避拦截7.2 组合优化方案令牌桶限速可与前文连接池复用、超时控制、gzip 解压、异步写入等技巧组合使用构建全链路优化体系同时可搭配随机请求间隔、UA 轮换、代理池切换进一步弱化爬虫特征提升稳定性。

相关文章:

Python 爬虫进阶技巧:爬虫限速与令牌桶算法实现

前言 在网络爬虫工程落地实践中,高频无节制的并发请求、短时间密集访问目标站点,是引发 IP 封禁、接口限流、验证码拦截、WAF 拦截、账号封禁等风控问题的核心诱因。多数初级爬虫开发者仅关注爬取效率,盲目提升请求频率与并发数量&#xff0…...

Python 爬虫反爬突破:WebGL 指纹与 Canvas 绘图指纹深度伪装

前言 随着互联网平台风控体系的全面升级,传统 UA 伪装、IP 切换、Cookie 隔离等基础反爬手段已无法满足高防护站点的采集需求。现代主流互联网产品不再仅依赖网络层 IP 检测与请求参数校验,而是深度结合浏览器硬件指纹、绘图指纹、WebGL 图形指纹、设备…...

C2C接口消息结构与流控制机制解析

1. C2C接口消息结构解析C2C(Chip-to-Chip)接口作为现代异构计算架构中的关键通信通道,其消息结构的精细设计直接决定了跨芯片通信的可靠性和效率。在协议栈中,消息结构通过精确的字段宽度和编码值定义各类控制与数据交互语义&…...

Python 爬虫进阶:Canvas/WebGL 指纹与 JS 沙箱全维度突破实战

前言 在当前互联网反爬体系持续升级的行业背景下,基础 UA 伪装、IP 代理、Cookie 维持等传统绕过手段已无法满足高强度站点的采集需求。现代化企业级反爬体系不再单纯依赖请求频率与基础请求头校验,而是深度融合浏览器指纹采集、前端环境校验、JS 沙箱隔…...

终极精简方案:3步打造纯净高效的Windows 11系统镜像

终极精简方案:3步打造纯净高效的Windows 11系统镜像 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 在数字时代,系统性能直接影响工作效率…...

【LLM】DeepSeek-V4模型架构和训练流程

note 混合注意力架构:我们设计了一种结合压缩稀疏注意力(Compressed Sparse Attention, CSA)与重度压缩注意力(Heavily Compressed Attention, HCA)的混合注意力机制,显著提升长上下文处理效率。在百万 To…...

5步终极静音方案:用FanControl让显卡风扇从30%降到0 RPM

5步终极静音方案:用FanControl让显卡风扇从30%降到0 RPM 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/…...

PDUR路由基本功能

一、PduR路由基本功能概述   PduR(PDU Router)模块是AutoSAR架构通信协议栈的通用模块,也就是CAN、Lin、Eth、FlexRay等总线通信、诊断报文传输的时候都会经过PduR模块。 为什么需要PduR模块:   可以理解PduR作为一个软件中间…...

C语言第五章数组

1. 一维数组概念数组的定义数组:是相同类型元素的一个集合。在内存中是一段连续的空间。可以将C语言中的一维数组通俗地理解为「一排储物柜」或「一条有序的盒子序列」。每个储物柜(数组元素)可以存放一件物品(数据)&a…...

2026年免费视频文字提取工具对比:微信小程序vs桌面软件实操清单

做短视频内容的时候经常卡在几个问题上:录好的素材怎么快速出文案、会议视频转录要花多少时间、链接视频能不能直接提取文字而不用下载。这些需求看似小,但如果工具选不对,能把整个制作流程拉长。我会先讲微信里有个叫提词匠的小程序在这类需…...

clawsquire:基于RAG与知识图谱的智能代码助手设计与实战

1. 项目概述:一个面向开发者的智能代码助手最近在GitHub上看到一个挺有意思的项目,叫Jiansen/clawsquire。乍一看这个名字,可能有点摸不着头脑,但点进去研究后,我发现这是一个定位非常清晰的开发者工具。简单来说&…...

微信小程序、在线工具、桌面软件,2026年视频转文字工具怎么选

同样是需要把视频转成文字,用微信小程序和用专业转录软件的体验差别比较大。前者即开即用无需等待,后者功能完整但操作流程略显复杂。我在工作中经常需要处理视频素材提取文案,下面会分享一些实用的工具方案,其中微信搜索「提词匠…...

录音转文字免费工具有哪些?免费录音转文字工具对比与推荐

开头做视频素材处理的时候,经常卡在一个问题:怎么把录音、视频里的人声快速提取成文字。大多数人默认想到的是找个桌面软件或者网页工具,但其实微信小程序里有个叫提词匠的工具在这块需求上效率比较高,下面会重点拆解它,因为它能覆盖大多数人的日常场景——无论是会议录音、课程…...

桌面/在线/小程序三种路线,2026年免费录音转文字工具怎么选?

同样是处理音频文件,用桌面软件和用微信小程序的体验差别比较大。前者需要下载安装、学习界面逻辑,后者搜一下就能用,等待时间也更短。如果你的需求很简单——比如临时转几段录音、快速提取视频文案,那小程序路线省事得多。本文主要拆解免费录音转文字工具的几种主流方案,重点讲…...

终极指南:用RPFM轻松打造你的《全面战争》梦想模组

终极指南:用RPFM轻松打造你的《全面战争》梦想模组 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gitcod…...

免费开源:用League Director制作专业级《英雄联盟》高光视频的完整指南

免费开源:用League Director制作专业级《英雄联盟》高光视频的完整指南 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/leaguedirec…...

告别TF卡!保姆级教程:让Orange Pi 5从SATA SSD启动Ubuntu系统(含VNC远程桌面配置)

告别TF卡!Orange Pi 5从SATA SSD启动Ubuntu全流程指南 在单板计算机的世界里,存储性能往往是制约整体体验的关键瓶颈。Orange Pi 5作为一款性能出众的开发板,当搭配传统TF卡运行时,其IO性能损失可能高达70%。本教程将带你完成从TF…...

关于OFIRM(本源场直觉共振模型)理论体系的深度解析:数学,检验,预测,证伪【这是对几篇核心基础论文的总结】

关于OFIRM(本源场直觉共振模型)理论体系的深度解析:数学,检验,预测,证伪Authors: Haiting Allen ChenAffiliations: Chen Xiao’er Creative Workshop, Independent Researcher, Guangzhou, China.Corres…...

copaw:命令行驱动的个人代码片段管理工具,提升开发效率

1. 项目概述:一个为开发者量身定制的代码片段管理工具在日复一日的编码工作中,我们总会遇到一些“似曾相识”的场景:一段处理日期格式的通用函数、一个封装好的网络请求方法、或者是一套复杂的数据库查询逻辑。这些代码片段就像工具箱里的螺丝…...

文化与文明是两回事!弄不懂这一点,再努力也是“庸人自扰”

我们常听到一句话:“中华文化博大精深,源远流长。”也常听人说:“现代文明带来了便利,也带来了困扰。”但你有没有想过一个问题——文化和文明,到底是不是一回事?很多人觉得它们差不多,甚至混着…...

Maven基础架构与整体认识

🚗🚗🚗🚗🚗🚗🚗 数据结构专栏🚗🚗🚗🚗🚗🚗🚗🚗🚗🚗 🛹&#x1…...

NVIDIA Isaac Sim与OSMO构建机器人仿真工作流实践

1. 项目概述:基于NVIDIA Isaac Sim与OSMO的端到端机器人工作流构建在机器人技术快速发展的当下,我经常被同行问到一个核心问题:如何高效训练适应复杂动态环境的机器人策略?经过在工业物流场景的多次实践验证,采用物理精…...

Weft轻量级Web框架:高性能路由与中间件设计实践

1. 项目概述:Weft,一个轻量级Web框架的诞生在Web开发的世界里,框架的选择往往决定了项目的起点和未来的走向。对于许多开发者,尤其是那些构建中小型API服务、需要快速原型验证或追求极致性能与简洁性的场景,像Spring B…...

Stakater Application:云原生应用部署的声明式框架与GitOps实践

1. 项目概述:一个云原生时代的应用部署“瑞士军刀”如果你和我一样,在Kubernetes上折腾过一段时间,肯定遇到过这样的场景:一个应用上线,背后跟着一堆YAML文件——Deployment、Service、ConfigMap、Secret、Ingress………...

Java之循环结构

一、语言中的结构:顺序结构、分支结构、循环结构二、循环的概念1.通过某个条件,重复并且有规律的执行一段程序代码。2.组成:循环变量的初始化、循环条件、循环变量的改变(增加、减少)、循环体(需要重复运行…...

Cursor智能体开发:令牌与定价

现在我们已经从宏观层面了解了 AI 模型的工作原理,接下来看看一个既能帮助你理解模型如何“思考”,又能帮助你理解使用成本的概念:令牌(tokens)。 你可以把令牌理解为 AI 模型实际处理的“词”。但它们并不等同于我们…...

仿照Muduo的高并发服务器:EventLoop模块及与TimeWheel模块联调

本期接着深入编写项目代码 相关代码上传至gitee:喜欢可以点个赞谢谢 目录 EventLoop模块 Eventfd机制 设计思路 源码 TimeWheel时间轮模块整合 设计思想 源码 EventLoop模块与TimeWheel模块联调整合 EventLoop模块 Eventfd机制 eventfd是本项目中的一种事件通知…...

三生原理文章被AtomGit‌开源社区收录的意义探析?

AI辅助创作:AtomGit‌ 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台,致力于构建一个中立、开放、公益的开发者生态。AtomGit‌ 在中国开源与人工智能融合生态中处于领先地位‌,是推动国产AI基础设施发…...

Three.js 代码云效果 | 三维可视化 / AI 提示词

Three.js 代码云效果 | 三维可视化 / AI 提示词 📋 AI 提示词 使用 Three.js 的 ShaderMaterial 创建代码云效果,通过多个代码纹理的随机切换和下落动画,实现代码雨的视觉效果。🖼️ 效果预览 🎮 案例演示 立即体验…...

内存增强语言模型:TRIBL2与IGTree架构对比与实践

1. 项目背景与核心价值在自然语言处理领域,内存增强型语言模型近年来展现出独特的优势。TRIBL2和IGTree作为两种典型的内存架构,通过外部记忆模块扩展了传统神经网络的上下文处理能力。这类模型特别适合需要长期依赖关系的任务场景,比如对话系…...