代理ip池并发限速设计:别让“秒封”毁了你的爬虫
——从“代理IP并发限速”到“反风控策略”的实战笔记
一、先别急着加机器,先搞懂“并发”≠“无限并发”
很多刚入坑的小伙伴以为代理ip池=无限子弹,把线程旋钮拧到1000就能秒天秒地。结果不到五分钟,403、滑块、验证码三连击,IP成批阵亡。真相是:目标站点后台都有“单位时间同一IP请求阈值”,超过就标记异常,轻则限速,重则整段IP被封。所以“并发”必须先让位于“限速”,否则再多住宅代理也救不了。
二、并发限速的“三段式”阀门:入口→池子→出口
- 入口阀:给爬虫程序戴“手铐”。用令牌桶或漏桶算法,把全局请求卡在安全线以下,比如每秒不超过60次。
- 池子阀:给每个IP单独计数。Redis里用
IP:timestamp:count
做滑动窗口,30秒内超过80次就锁10分钟。 - 出口阀:动态降权。发现响应里出现“retry later”关键词,自动把该IP权重降到0.1,让调度器优先使用其他节点。三段阀门环环相扣,比单点限流稳得多。
三、住宅代理与机房IP的“限速差”
住宅代理ip自带“真人光环”,阈值可以稍微放飞,比如每秒3~5次;机房IP则容易被“重点关照”,建议压到每秒1次以内。把两类IP分到不同通道,限速参数写进配置文件,后续只改数字不用改代码,运维半夜也能秒回滚。
四、随机化三板斧:时间+UA+路径
固定间隔请求=告诉对方“我是机器人”。在限速基础上再加随机休眠:0.5×基础延迟到1.5×基础延迟之间浮动;UA每次从池里随机抽;路径层面把“/search?q=xxx”拆成“/search?from=pc&q=xxx”等多套模板。看起来是“闲庭信步”,后台统计却能把峰值抹平,风控分数直接降一半。
五、实战代码片段:30行Python搞定“IP级限速”
import redis, time, random
r = redis.Redis()
def can_i_go(ip, max=80, window=30):
key = f"ip:{ip}"
now = int(time.time())
pipe = r.pipeline()
pipe.zremrangebyscore(key, 0, now - window)
pipe.zcard(key)
pipe.zadd(key, {now: now})
pipe.expire(key, window + 1)
cnt = pipe.execute()[1]
return cnt < max
调用时if can_i_go(proxy_ip): do_request()
,否则sleep(random.uniform(0.5, 1.5))
继续重试。没有Redis?用内存deque
也能跑,只是重启会丢数据。
六、踩坑预警:限速太低=浪费钱,太高=团灭
测速方法:挑10个IP,阶梯式上调并发,记录“首次出现验证码”时的QPS,取80%作为永久上限。记得每周复测,节假日风控升级,上周的安全线可能本周就失效。把测试结果写进飞书表格,老板看得懂,预算也批得快。
七、监控告警:让“封IP”变成“弹窗”而不是“客诉”
Grafana+Prometheus配一条简单规则:5分钟内IP成功率<85%就@全员。别等用户反馈“数据断了”才后知后觉。再狠一点,直接把失效IP推送到企业微信,运维小哥边喝咖啡边拉黑,十分钟恢复干净。
八、一句话总结
代理IP池的并发限速,其实就是“让机器像人一样慢”,再“让慢得有价值”。把限速做成配置、把随机化做成习惯、把监控做成肌肉记忆,风控就追不上你。
采购代理IP请添加微信客户经理:x31471626
评论0