招聘数据采集这条线上,HTTP代理比SOCKS5更抗封,差距接近3倍。过去30天我把同一套采集器在两种协议下各跑了15天,目标站是Indeed、Glassdoor加两家国内招聘平台,累计采了42.7万条岗位。这个结论和我三个月前的判断完全相反——当时我笃定SOCKS5更轻、延迟更低,已经在写迁移方案了,准备把用了两年的HTTP代理池整体换掉。
先说背景。我在一家做跨境业务的公司管技术,招聘采集是给HR和业务线做人才盘点和薪酬情报的,日均1.4万条岗位,要求覆盖北美、欧洲和国内主要城市。本文不复述两种协议的定义,只讲我在真实反爬环境里踩到的坑和跑出来的账。
一、封禁率19.3%对6.8%:那两周我被数据打脸
测试方法是双盲的:同一个采集器镜像、同一批目标URL、同一时间段,只换代理协议这一项变量。判定封禁的标准是返回403/429,或者连续两次拿到同一张验证码页面。
| 指标 | SOCKS5池 | HTTP代理池 | 差异 |
|---|
| 请求封禁率 | 19.3% | 6.8% | 2.8倍 |
| 验证码触发率 | 27.4% | 11.2% | 2.4倍 |
| 平均响应延迟 | 183ms | 121ms | -34% |
| IP存活超24小时占比 | 33% | 78% | 2.4倍 |
| 单条岗位采集成本 | 0.0031元 | 0.0024元 | -23% |
看到第三行你可能觉得奇怪:SOCKS5不是号称更轻量吗,怎么延迟反而高?我一开始也想不通,后来抓包才发现问题不在协议解析开销上——那点差异连1毫秒都不到,真正的成本在重连和重试次数上,封得多自然就慢。
二、SOCKS5输在哪:三个被链路藏起来的细节
1. 连接复用把同一批请求串成了糖葫芦
SOCKS5是纯TCP隧道转发,它在握手之后基本不参与会话管理,客户端默认会开着keep-alive把一条隧道用到底。招聘站的风控很容易从连接维度做聚合:一条TCP上如果十分钟内出现了38次不同岗位的翻页请求,这个特征比IP本身更刺眼。HTTP代理在做CONNECT隧道时,我可以主动把max_keepalive_connections设为0,让每次请求独立建连,把粒度打散。
2. 池子质量和协议是绑定的,这点我一开始没意识到
说实话,我是跑到第二周才想明白:不是SOCKS5协议本身差,而是市面上做SOCKS5的池子普遍偏杂。我测的那家,端口段是连号的,抓了几个IP反查ASN,机房和数据中心转售混在一起,纯净度本来就低。HTTP代理这条线上做城市级定位和运营商分层的服务商更多,能挑到干净货的概率更高。协议决定了你能用上哪一批IP,而不是IP决定了协议好不好。
3. 头部一致性和HTTP/2这两块,我承认没完全验证
我们的采集器是模拟Chrome的,走SOCKS5时补丁库里有两处HTTP/2帧顺序对不上,触发过一次302拦截。这块我没有做严格的A/B对照,不敢下死结论,但直觉上走HTTP代理时中间层能帮你兜一部分头部细节,容错空间确实大一些。
三、招聘站采集的HTTP代理配置清单
最终落地的方案是隧道代理+禁连接复用+失败熔断,参数如下,可以直接抄:
import httpx, time, random
PROXY = "http://user-rot:pass@tunnel.xxx:8080" # 白名单已绑定本机出口IP
LIMITS = httpx.Limits(max_connections=2, max_keepalive_connections=0)
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/122.0 Safari/537.36"
def fetch(url, retry=3):
for i in range(retry):
try:
with httpx.Client(proxy=PROXY, limits=LIMITS, timeout=12.0,
headers={"User-Agent": UA,
"Accept-Language": "en-US,en;q=0.9"}) as c:
r = c.get(url)
if r.status_code in (403, 429):
raise RuntimeError("blocked")
return r.text
except Exception:
time.sleep(1.5 ** i + random.random() * 0.4)
return None
配套的调度规则:
- 轮换粒度:每5-8次请求切一次出口IP,而不是按时间切。招聘站的岗位列表页权重高,详情页权重低,混着切比整站切更稳。
- 并发限制:单IP并发压到2,整池40。超过这个数,403率从7%跳到15%以上,拐点很明显。
- 熔断阈值:同一IP连续5次403或429,进冷却队列30分钟;整池5分钟内错误率超25%,降速50%并告警。
- 重试策略:指数退避,基数1.5,最多3次,别无限重试——无限重试是最快把IP打死的方式。
现网这套隧道入口按天计费,接入方式是API提取加白名单,我平时用后者省得维护账密,参数在mayihttp.com上都能直接拉出来对。换回HTTP代理之后,30天的验证结果是封禁率稳定在6%-8%区间,日均采集量从0.9万回升到1.4万,缺口的报表也没人再来找了。
四、我仍然会用SOCKS5的边界
不是说SOCKS5没用。我们内部还有一条链路走的是它:采集非HTTP协议数据源,比如用FTP拉公开数据集、以及需要WebSocket长连接穿透内网的场景,HTTP代理做CONNECT隧道虽然也能过,但配置成本高、排障链路长,不如SOCKS5直接。
另外提醒一句,协议选型只是第一层,如果你每天的量级到千万请求,真正决定成败的是IP调度架构和业务侧的请求节奏控制,协议换一换带来的那点差异会被彻底淹没。中小团队先选对协议和池子,别急着上复杂的调度系统,这是我踩了三次坑才认下的顺序。