周一早上九点,我盯着监控大屏上并排的两个数字:68.5% 和 99.1%。同一个内容审核任务,同一批目标站点,同一套判定模型,唯一变量是代理层换了一套。前者是我们上个月为了省钱接入的公开SOCKS5池,后者是重做调度之后的短效住宅池。中间隔着三天、四次回滚,和一次差点把业务方惹毛的故障。
先说清楚场景:我们做的是批量网页内容合规检测,每天要抓约 40 万个落地页快照,覆盖电商、社交、资讯三类站点,判断页面里有没有违规文案、诱导性素材和黑产外链。这类任务的特点是——目标站点极度分散,单站点请求量不大,但整体IP消耗量惊人,而且请求频率一旦被识别,整个IP段都会被拉黑。代理不是辅助工具,是这条流水线的生命线。
一、三天实测:三种代理形态的反直觉排序
我们把同一批 12 万个URL拆成四组,用四种代理形态各跑一遍,统计成功率、单IP存活请求数和延迟。结果出来的那天,团队里有人沉默了很久——我们原本以为性能最好的IDC方案,排在了倒数第二。
| 代理形态 | 平均成功率 | 单IP平均存活请求数 | P95延迟 | 万次请求成本 |
|---|
| 公开免费SOCKS5池 | 68.5% | 3.2 | 2140ms | 0元 |
| IDC机房固定IP | 82.1% | 11.4 | 312ms | 4.8元 |
| 短效住宅SOCKS5 | 99.1% | 47.6 | 680ms | 22.3元 |
| 隧道代理(HTTP/SOCKS5双协议) | 98.6% | 不适用 | 190ms | 16元/天 |
免费池的表现没什么好说的,3.2 次请求就报废一个IP,等于每抓三个页面就要等一次切换,调度开销比抓取本身还大。真正让我意外的是 IDC 机房方案:延迟只有住宅IP的 45%,单IP存活数却不到后者的四分之一。这个反差,得从风控那边找答案。
二、站在风控那一侧:我为什么优先封这类流量
我入行前三年写的是反爬系统,所以看代理这件事的视角有点扭曲——我会先想"如果我是防御方,这批流量哪里长得不像人"。
三个最容易被锁定的特征
- 行为熵过低:一个IP在 3 分钟内访问 40 个不相关域名,且请求间隔标准差小于 0.3 秒,这在行为模型里是几乎确定性的机器特征。
- 出口网段聚集:机房IP的 /24 段往往整段被同一批客户共用,只要段内任何一个人触发风控,整段进黑名单,你的成功率会被邻居拖下水。
- SOCKS5握手本身的指纹:大量SOCKS5服务在CONNECT阶段就把目标域名以明文方式交给代理,本地DNS解析的结果也会暴露;而正规住宅出口的解析行为和归属地一致,两者一比对就露馅。
所以延迟低不是优势,反而是负债。机房出口的RTT过于"干净",同段流量又密集,风控模型不需要多聪明就能把你挑出来。住宅SOCKS5延迟高出一倍多,但它的出口分散在365+城市、三大运营商,行为熵天然更高,单IP能扛 47 次请求也就不奇怪了。
这里有个我一开始判断错的地方:我原以为住宅IP的慢会被超时拖垮整体吞吐,实测下来并没有。我们设的是 3 秒连接超时、8 秒读取超时,住宅池的超时率只有 1.2%,而机房池因为被封导致的连接重置率是 7.9%。慢一点不要紧,关键是连接能不能建立起来。
三、落地架构:短效池为主,隧道兜底
最终方案是三层调度,核心思路是"让每个IP的请求数停在风控阈值以下,而不是等它被封再换"。
- 按目标域名分桶:同一个域名固定走一组IP,避免一个IP今天访问电商明天访问论坛,行为画像更干净。
- 单IP复用上限设 15 次,到量立即释放,不赌它还能再撑。切换间隔做 30-90 秒随机化,别用固定周期。
- 隧道代理做兜底:某个域名桶的成功率跌破 95% 时,自动切换到隧道入口,让服务商侧负责换IP,我们在业务层只看到稳定的单一入口。
一段踩了三次坑的接入代码
import requests, random
def fetch(url, pool):
ip, port, user, pwd = random.choice(pool)
# socks5h 让 DNS 在代理端解析,避免本地解析器暴露真实归属
proxy = f"socks5h://{user}:{pwd}@{ip}:{port}"
s = requests.Session()
s.trust_env = False # 防止宿主机环境变量里的代理串进来
try:
return s.get(url,
proxies={"http": proxy, "https": proxy},
timeout=(3, 8))[:1]
finally:
s.close()
坑在哪?第一版我们复用了全局 Session,结果连接池把TCP连接一直保活,等于IP根本没换,成功率卡在 84% 不动。第二版忘了 socks5h 而是用了 socks5,本地解析把真实DNS请求暴露了出去。第三次是 trust_env,测试机上配的环境变量代理一直在偷偷生效——这个最难查,因为它只在部分机器上出现。
四、上线两周后的曲线,和三个没解决的问题
切换后第一周,内容审核任务的端到端成功率稳定在 99.1%,因代理失效导致的失败率从 12.4% 降到 0.3%,日均40万请求下单IP消耗约 8500 个。成本从每月 300 多块涨到了 1800 块左右,但业务方那边——他们之前每天要人工复核 2000 多条失败记录——反而没再投诉过。
遗留问题有三个,我不打算粉饰:一是验证码比例从 4% 升到了 6.8%,住宅IP的"干净"程度不如从前了;二是地域错配,我们需要北京IP时经常分到周边城市,城市级精度还得靠专门的调度接口;三是成本随请求量线性上涨,如果哪天日请求量翻到百万级,这套方案得重新算账。
如果你也在做类似的内容审核流水线,选型的判断顺序建议是:先看出口类型的分散度,再看单IP可复用次数,最后才看延迟和价格。我们现在的主力住宅池走的是 mayihttp.com 的短效SOCKS5按IP计费,隧道入口那边配的是按天包的方式,两个加起来把抖动吃掉了一大半。