并发数应设为10起始并动态调整,避免超15触发风控;推荐用asyncio+aiohttp替代线程池,限制单域名连接数、设置超时、按需创建会话;503/429需降频而非重试;代理需健康度加权采样。

并发数不是越大越好,盲目设高反而加速被封。 真正有效的并发限制,是让请求节奏像真人、负载分布像分布式节点、失败响应能自我调节——而不是靠“开10个线程+睡1秒”这种静态配置硬扛。
ThreadPoolExecutor 的 max_workers 不要超过 15
本地测试时设 max_workers=50 可能跑得欢,但线上一开就触发风控阈值。2026年主流网站的链路风控系统会统计单IP每分钟请求数、请求时间戳熵值、TCP连接复用率等指标,max_workers 超过 15 后,即使加了随机延时,请求时间戳分布仍显规律,容易被标记为“机器指纹”。
- 推荐起始值设为
10,再根据目标站响应码动态调整 - 若连续出现 3 次
429或503,立即降为5;恢复后逐步试探回升 - 避免在
ThreadPoolExecutor外层再套一层循环发请求,这会导致实际并发远超设定值
用 asyncio + aiohttp 替代 requests + threading
requests 是同步阻塞式,每个线程独占一个 TCP 连接,10 个线程就是 10 个长连接,特征太明显;而 aiohttp 在单线程内复用连接池,请求调度更接近浏览器行为,且天然支持连接限速、超时熔断、自动重试。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 设置
connector = aiohttp.TCPConnector(limit_per_host=5),限制单域名并发连接数 - 用
client_timeout = aiohttp.ClientTimeout(total=15, connect=5)避免卡死拖垮整个协程池 - 不要全局共用一个
ClientSession实例,应在 async context manager 中按需创建
503 和 429 响应必须触发降频逻辑,不能只 retry
很多爬虫把 503 Service Unavailable 当作临时错误无脑重试,结果 3 秒内重发 3 次,直接坐实“攻击行为”。真正的降频不是加 sleep,而是暂停该 IP 的所有任务、切换代理(如有)、并下调后续请求的并发权重。
- 捕获到
503时,调用semaphore.acquire()占用一个信号量槽位,相当于主动让出 1 个并发额度 - 遇到
429 Too Many Requests,记录当前时间戳,后续 60 秒内对该域名的所有请求强制 delay ≥ 5 秒 - 响应头含
Retry-After字段时,必须严格遵守,哪怕它返回的是 3600(1 小时)
代理 IP 切换不能只靠轮询,得配合响应质量反馈
静态轮询代理池,等于把所有 IP 暴露在相同请求节奏下,一旦某个代理被标记,整池都会被连带观察。真实有效的方式是:每个代理绑定独立的失败计数器和成功率滑动窗口,只把健康度 > 85% 的代理放进活跃队列。
- 每次请求完成,根据状态码更新代理健康度:
200加分,403/429/503扣分,连续 3 次失败则剔除 10 分钟 - 不使用
random.choice(proxies),改用加权采样:random.choices(proxies, weights=[p.health for p in proxies]) - 代理响应时间 > 8 秒或空响应体,也计入失败,防止“假活代理”拖慢整体节奏
并发限制的本质不是压低数字,而是让每一次请求都携带足够多的“人类信号”:连接复用、时间抖动、失败退避、IP健康感知。这些信号叠加起来,才能绕过 2026 年那套基于行为审计+动态阈值的风控系统。漏掉任意一环,数值再合理也白搭。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










