先纠正一个我听了不下十次的说法:企业HTTP代理就是把地址和端口填进 proxies 参数,剩下的跟直连一样。这个认知在单线程、每天几百次请求的场景下危害不大,但只要并发上到两位数、目标站又带访问限制,它会让你的成功率从 95% 掉到 60% 出头。我去年接手一个学术论文采集项目时就是这么翻车的。
项目背景简单说:给一个自媒体矩阵做选题素材,需要定期扫多个学术数据库的论文标题和摘要。其中两个库对访问频率和会话一致性卡得很死。下面两块是我真正花时间的地方——隧道开销和轮换粒度。
CONNECT隧道不是免费的:一次请求背后藏着四次握手
HTTPS 走 HTTP 代理,客户端先向代理发一条 CONNECT host:443,代理回 200 之后才开始和目标站做 TLS 握手。也就是说每条新隧道比直连多出两段往返:代理协商 + 认证。我实测单条隧道建立耗时 120-180ms,同时段直连只要 40-60ms,差了将近三倍。
问题在于,很多人写了循环但没写连接池。requests 的 HTTPAdapter 默认 pool_maxsize 只有 10,并发一旦超过这个数,多余的请求会不断新建隧道。我在 20 并发下测过:P95 延迟从 210ms 涨到 780ms,翻了三倍多,而你打开监控只会看到"代理慢",根本不知道是自己在疯狂握手。
import requests
from requests.adapters import HTTPAdapter
s = requests.Session()
s.mount('https://', HTTPAdapter(
pool_connections=64,
pool_maxsize=64,
max_retries=2,
))
s.proxies = {"https": "http://user:pass@tunnel-host:port"}
for url in urls: # 复用同一个 Session,隧道才会被复用
s.get(url, timeout=15)
顺手提一句:白名单认证比账密认证省掉一次认证头协商,我在同一台机器上对比,单请求平均少 8-12ms。量小无所谓,日请求上万就是几分钟的差距。
轮换粒度:学术库不吃"每请求换地址"这一套
我一开始按直觉设了每请求轮换,结果第一个库的直接 403 率到了 62%。原因不复杂:那两个库在登录态里绑定了会话与出口地址,你一换地址,cookie 立刻失效,风控直接跳验证码页。这不是代理质量的问题,是策略和目标站机制对不上。
| 轮换策略 | 403/验证码率 | 单IP峰值频次 | 适合目标 |
|---|
| 每请求轮换 | 62.3% | 1 次 | 无会话的列表页 |
| 5 分钟粘性 | 4.8% | 约 90 次 | 带登录态的详情页 |
| 30 分钟粘性 | 3.1% | 约 400 次 | 低频目标,易触发频次限流 |
中间还踩了个坑:老板觉得粘性窗口越长越省,让我压到 1 分钟以内,说要"保持新鲜"。跑了三天验证码率翻了三倍,第四天自己改回来了。最终稳定在 8-12 分钟粘性、按目标域名独立分池,两个严格库单独一个池,其余放开轮换。
并发拐点与成本账:把单次采集压到 0.003 元以下
拐点比我预想的早。同一批目标,并发从 10 加到 60,成功率几乎不动,稳定在 99.3%-99.6%;超过 60 之后一路下滑,80 并发时掉到 97.1%。排查下来不是代理扛不住——上游延迟没变——是目标站开始按会话频次限流。这就是我前面说的,很多"代理不行"的结论其实是采集端自己造成的。
成本这边算得更细。一篇论文详情平均 2.3 个请求(列表 + 详情 + 偶尔的重试),日 8 万请求。按动态代理 0.0022 元/IP 起的价位,加上重试损耗约 6%,单次成功采集成本压在 0.003 元以下。我主力用的那条隧道来自蚂蚁代理,选它的理由很朴素:延迟稳定在 10ms 以内、可用率实测 99.9%,按天计费对流量波动大的采集任务更友好,不用为闲置 IP 买单。
一套能直接抄的排障清单
- 先关掉并发跑单线程,确认目标站本身可达,别一上来就怀疑代理。
- 检查
pool_maxsize 是否小于并发数,这是延迟虚高的头号原因。 - 用固定粘性窗口跑 200 次请求,看 403 率;高于 10% 就缩短到 5 分钟再测。
- 把严格目标拆到独立子池,不要和宽松目标共用轮换策略。
- 并发按 10 递增,记录成功率和 P95,找到你自己的拐点再固定。
- 给重试设上限(我做的是 2 次),避免被限流时把池子烧穿。
说实话这套配置在我们日 8 万请求的量级够用。如果你一天跑百万级,60 这个拐点会提前,得分域名做限速队列。学术库这类目标还有一个隐藏的坑:部分库对 UA 和 TLS 指纹的敏感度高于对 IP 的敏感度,我也在补这块的对照实验,有结论再写。
完整参数和接入方式在 mayihttp.com 上能看到。