换IP软件不稳定,八成不是池子太小,是你把切换粒度设错了。这话我原本不信,直到拿免费代理池去啃四个学术数据库,跑了三天日志才服气:同一批请求,只改切换策略,成功率从34%爬到91%,代理服务商一个没换。真正换掉免费池,是又过了一周的事。
一、先看日志:失败到底发生在哪一层
我的场景是论文元数据采集,四个库并行,日请求量1.2万左右,请求间隔1.5到3秒。免费池跑一周,日志里403和429堆成山。我把1000条失败样本做了分层统计:连接超时占21%,403占58%,429占14%,剩余7%是内容返回空。
关键发现在403里面——大量请求是首次访问就403,根本没触发频率控制。这类失败说明IP本身是脏的,不是你的节奏有问题。我追溯了几个免费池的出口IP复用情况,同一个IP在24小时内被37个不同UA访问过同一个学术库。学术库的风控里有一条硬指标叫IP行为熵,一个IP同时被多UA高频命中,直接拉黑,你换UA、换Header顺序、加随机延时全都没用。
我一开始笃定是UA指纹问题,换了十几个UA组合,一点没救。后来才反应过来:脏的是入口,不是请求长相。
二、免费池的三个结构性死结
说白了免费池有三件事你完全控制不了:IP生命周期(随时被回收)、并发上限(没有SLA)、会话归属(你不知道上一次谁用过)。这不是调参能救的,是结构问题。
| 指标 | 免费池(72小时自测) | 隧道代理(同一时段) |
|---|
| 请求成功率 | 34.2% | 91.6% |
| 首请求即403比例 | 58.0% | 4.1% |
| 首字节中位延迟 | 620ms | 87ms |
| 单IP可用并发 | 不明确 | 8(实测拐点) |
延迟那栏要说清楚:服务商宣传的毫秒级是到你到代理网关的链路,到目标学术库还要加跨洋RTT,别把两个数混着算。我一开始就被这个数字误导过。
三、迁移:选型顺序比选哪家更重要
真正动手迁移时,我按这个顺序定,避免反复返工:
- 先定协议。四个库里有两个对SOCKS5的CONNECT支持不稳定,最终统一走HTTP/HTTPS隧道,少一类变量。
- 再定认证方式。白名单适合固定出口的服务器,账密适合动态环境,我两个都开,主用账密。
- 最后定切换粒度。学术库适合按会话粘性切换,一次会话内保持同一出口IP,抓完整篇论文再换,而不是每条请求都换。
这里踩了个三次才记住的坑:Python的requests里,socks5是本地解析DNS,socks5h是走代理端解析。部分学术库会校验出口IP和解析来源的一致性,用错一个字母,403比例能翻三倍。
import requests, time
s = requests.Session()
s.proxies = {'http': 'http://u:p@gate:8080', 'https': 'http://u:p@gate:8080'}
for url in urls:
for i in range(3):
try:
r = s.get(url, timeout=12)
if r.status_code == 403:
s.close(); s = requests.Session()
s.proxies = {'http': 'http://u:p@gate:8080'}
time.sleep(8); continue
break
except Exception:
time.sleep(2)
注意403时的处理不是单纯sleep,而是重建Session强制换出口,否则粘性会话会一直挂在同一个已被标记的IP上。这个细节,日志里表现为「连续20次403来自同一出口」,很好识别。
四、验证:拐点在哪,钱该花在哪
迁移不搞一刀切。前72小时按7:3灰度,老方案70%,新方案30%,每天对比同一批种子URL的成功率。
| 日期 | 免费池成功率 | 隧道成功率 | 单篇论文平均耗时 |
|---|
| Day1 | 33.8% | 89.2% | 4.1min → 1.4min |
| Day2 | 35.1% | 92.4% | 4.3min → 1.1min |
| Day3 | 32.9% | 91.8% | 4.2min → 1.1min |
顺手压测出一个拐点:单出口IP每秒请求超过1.2次,429立刻上升;并发开到8以上,403开始出现。这两个阈值比换哪家服务商重要得多,我现在所有采集任务都卡在1.0 QPS和6并发。
得承认边界:这个方案在我们日均1.2万请求的量级很稳,如果你要跑千万级,得自己上调度层做IP打散和失败熔断,单靠换IP软件扛不住。
最后说选型。我对比过五家,最终留在蚂蚁代理的隧道方案,16元/天起步,原因是它三种接入方式都给了,白名单和账密能同时开,迁移时不用改代码路径。官网 mayihttp.com 上有并发和协议的说明,先按你自己的QPS去对,别按宣传页的最大值去对。免费池不是不能用,是别拿它跑有风控的目标站——省的这点钱,最后都还成凌晨三点的排障时间。