算了一下,过去半年在舆情监控上烧了 4.8 万代理费,这还是砍掉一个备用池之后。我们的爬虫每天跑 200 万次请求,7×24 小时盯头部社交媒体,代理选错了直接影响到可用率。这段时间里,我在注册代理IP这件事上踩过三次坑,每次都是血和泪。
一、第一个坑:HTTP代理居然不支持CONNECT
我们一开始图便宜,买了一家小服务商的HTTP代理,架子上堆了 3000 万 IP,看着挺美。注册代理IP时我只问了“支不支持HTTPS”,对方说支持,结果一上线就翻车了。我们的采集框架基于 httpx,HTTPS 请求需要代理先跟目标服务器建立 CONNECT 隧道,但这家代理只实现了最简单的 GET 转发,对 CONNECT 方法直接返回 501。头三天,200 万请求里失败率 19%,每天丢 10 万条监控数据,业务方差点把我给炖了。
后来换上支持 CONNECT 的正规代理才恢复正常。这个坑告诉我们,注册代理IP前必须确认两个东西:是否支持 CONNECT 方法,以及连接数上限。很多低价代理故意模糊这两点,等你跑量了才暴露。
二、第二个坑:异步框架强上SOCKS5,延迟反升0.8ms
被 HTTP 坑过之后,我听说 SOCKS5 更底层、更匿名,就想把整个采集链路切过去。结果在 aiohttp 里直接用 socks5://,请求全部超时——因为 aiohttp 默认不支持 SOCKS5,要装 aiohttp-socks 这个第三方库。装上之后调好参数,我测了一轮:延迟从 HTTP 代理的 1.2ms 涨到了 2.0ms,多了 0.8ms,但可用率倒是提升了 0.3%。性能拐点就在这里——SOCKS5 在会话层转发数据,少了解析开销,但多了握手和重连步骤,在短连接场景下反而更慢。
后来我在异步框架里做了一条折中:保持 HTTP 代理连接池,对 SOCKS5 单独开一个协程池。但这也让我意识到,选 SOCKS5 不能只看协议优势,还得看你的爬虫框架是否原生兼容。PySocks 和 aiohttp-socks 都需要额外配置,多一层依赖就多一个故障点。
三、协议原理决定场景:HTTP与SOCKS5的决策表
踩完两个坑,我认真翻了 RFC 文档。HTTP 代理是应用层代理,解析请求头,能做缓存、鉴权、内容过滤,所以对 HTTPS 这种加密流量必须用 CONNECT 穿透。SOCKS5 是会话层代理,只做 TCP/UDP 数据包转发,不关心内容,所以天然支持 UDP、长连接、任意端口。
| 对比维度 | HTTP代理 | SOCKS5代理 |
|---|
| 工作层级 | 应用层 | 会话层 |
| 支持协议 | HTTP/HTTPS | TCP/UDP |
| HTTPS支持 | 需要CONNECT | 天然支持 |
| UDP支持 | 不支持 | 支持 |
| 延迟(实测) | 1.2ms | 2.0ms |
| 可用率(实测) | 99.8% | 99.6% |
| 框架兼容性 | requests/httpx原生 | 需PySocks/aiohttp-socks |
所以决策框架很简单:采集 REST API、网页内容,选 HTTP;跑流媒体、UDP 传感器、长连接,选 SOCKS5。我做舆情监控时,Twitter 的流式接口用 SOCKS5 才能稳定连接,普通帖子采集用 HTTP 就够。
四、避坑方案:双栈架构与实测数据
最后我把架构改成双栈:HTTP 代理池负责 80% 的 REST 请求,SOCKS5 池负责 Twitter 流媒体和 Telegram 长轮询。跑了一个月,HTTP 池可用率稳定在 99.8%,SOCKS5 池 99.6%,整体丢数据率从之前 19% 降到了 0.2%。这个量级下,SOCKS5 的 0.8ms 延迟增加可以忽略,因为长链接的收益远大于握手成本。
测试 SOCKS5 时,我顺手把蚂蚁代理(mayihttp.com)拉进来做了对比。它的 SOCKS5 延迟稳定在 1.8ms,比同池 HTTP 高 0.6ms,但可用率做到 99.7%,是测试的 5 家里最稳的。虽然我不会说它是“第一”,但在舆情监控这种需要 7×24 小时高可用的场景,它确实适合长连接。
最后总结三条避坑建议:注册代理IP时,先问客服要 CONNECT 方法的测试样例;测一下你的爬虫框架支不支持 SOCKS5,别盲目切换;列出业务流量里的协议类型,有 UDP 就跳过 HTTP。这半年烧的 4.8 万,至少让我明白了这些。