先测速,把慢的环节揪出来
上周帮朋友看一个采集项目,同样的代码,直连两秒能拿回数据,挂上代理变成十几秒。他第一反应是服务商不行,准备换一家。我让他先把每个环节的耗时量出来,结果发现慢的不是代理本身,而是每次请求都在重新握手,加上超时设了 60 秒,碰到慢节点就干等。改了两处配置,速度回到三秒以内。所以说,代理慢,八成能自己调好,先别急着花钱。
一条代理链路其实分三段:你的机器到代理节点、代理节点到目标网站、再加上目标网站自己的响应时间。三段里任何一段出问题,表现都一样。动手之前,先用工具自带的计时参数把每段耗时量出来,分别测直连和挂代理两组数据:
# 第一轮:直连,记录基准
curl -o /dev/null -s -w "建连:%{time_connect}s 首字节:%{time_starttransfer}s 总计:%{time_total}s\n" https://你的目标地址
# 第二轮:挂上代理,测同一条地址
curl -o /dev/null -s -x "http://用户名:密码@代理主机:端口" -w "建连:%{time_connect}s 首字节:%{time_starttransfer}s 总计:%{time_total}s\n" https://你的目标地址
拿到两组数字对比着看:直连快、挂代理明显慢,问题就在代理这一段;建连时间占大头,多半是节点远或者线路绕;首字节时间高,可能是目标站响应慢,也可能是请求头触发了更严格的校验。数字不会骗人,先定位再动手,能少走很多弯路。
节点位置和线路,比任何参数都管用
光在光纤里跑,每一百公里大约增加 1 毫秒延迟,这是物理规律,软件层面省不掉。人在杭州,节点选在苏州和选在哈尔滨,建连时间天然就差一截。所以提速的第一原则很朴素:就近选节点。
但"近"不能只看地图直线距离。有的节点物理上不远,路由却要绕好几个城市,延迟反而比稍远但线路直的节点高。判断办法还是靠上面那组测速数据,多测几个候选节点,把建连时间从低到高排序,前两名就是你的主力节点。
| 节点选择 | 延迟水平 | 稳定性 | 适合场景 |
|---|---|---|---|
| 同城/邻市节点 | 通常 20ms 以内 | 高 | 对延迟敏感的实时任务 |
| 同省节点 | 20-50ms | 较高 | 日常公开数据采集 |
| 跨省远节点 | 50ms 以上 | 一般 | 任务指定其他地区时 |
| 多节点备用 | 取当前最优 | 最好 | 长时间不间断运行 |
还有个容易被忽略的因素:高峰时段。晚上八点到十一点线路拥挤,同一个节点的延迟能比白天高出不少。对速度敏感的任务尽量安排在白天跑,或者准备两三个备用节点,发现耗时上来了就换一个,别在一棵树上吊着。
协议怎么选:HTTP、HTTPS、SOCKS5 的速度账
三种协议的速度表现不一样,选错了等于白白多付开销。HTTP 代理的转发流程最短,纯 HTTP 接口的场景下它最快;HTTPS 请求经过代理时要先建一条隧道,再做加密握手,首次连接会慢一点,但把连接复用打开之后,后续请求走已经建好的通道,差距会缩到很小;SOCKS5 在更底层做转发,不管上层业务细节,某些对握手敏感的场景里表现更稳。
| 协议 | 握手开销 | 速度表现 | 建议用法 |
|---|---|---|---|
| HTTP | 低 | 三者中最快 | 无加密要求时优先 |
| HTTPS | 中 | 复用连接后接近HTTP | 需要加密传输时使用 |
| SOCKS5 | 低 | 转发层少、表现稳 | 需要更底层控制时使用 |
一句话总结:能用 HTTP 就用 HTTP;必须加密的就用 HTTPS 并把长连接开起来;对底层控制有要求再考虑 SOCKS5。别凭感觉选,拿同一节点三种协议各测一轮,数据说了算。
代码里抠速度:复用、超时、并发三件事
这三件事是性价比最高的优化,改几行配置,速度经常能翻一倍。
第一件,连接复用。每次请求都重新建连、重新握手,等于把最贵的开销重复付一遍。用 Session 把连接养起来,后续请求走同一条通道,平均耗时会明显往下掉。
第二件,超时给短。超时设成 60 秒,碰到慢节点就得干等一分钟。建议连接超时 3 秒、读取超时 10 秒,快速失败,把时间留给跑得通的请求。
第三件,并发别贪多。并发不是越大越快。开得太猛,本地带宽打满、代理端排队、目标站开始丢请求,错误率飙升,整体速度反而往下走。从 50 左右起步,盯住平均耗时和错误率两个指标,错误率超过 5% 就往回调,跑稳了再慢慢加。
import requests
# 用 Session 复用连接,避免每次请求都重新握手
session = requests.Session()
session.proxies = {
"http": "http://用户名:密码@代理主机:端口",
"https": "http://用户名:密码@代理主机:端口",
}
session.headers.update({"Connection": "keep-alive"})
def fetch(url):
try:
# 连接超时3秒、读取超时10秒,快速失败不干等
resp = session.get(url, timeout=(3, 10))
return resp.status_code, resp.elapsed.total_seconds()
except Exception:
# 失败就交给上层逻辑,立刻获取新的IP再试
return None, None
服务商的底子,决定优化上限
前面说的都是软件层面的功夫,如果代理本身质量不行,再怎么调也快不起来。拿神龙HTTP来说,3000万+正规授权代理IP储备、可用率 99.9%,意味着拿到手的 IP 绝大多数能直接用,不用把时间浪费在重试上;IP纯度 99.8%,被目标站拦下来的概率低,等于变相提速。300+城市级精准定位,想就近选节点时选择面足够大,同省甚至同城都能覆盖到。
提取和运维环节同样影响速度。神龙HTTP支持低延迟高并发提取,API 兼容主流爬虫编程语言,配上文档和示例代码,接进现有项目不用大改。跑起来之后,个人中心里的可视化用量统计和实时监控能帮上大忙:哪个时段慢、哪条链路异常,看一眼曲线就清楚,不用靠猜。碰到解决不了的问题,技术团队 7×24 小时在线,比自己闷头排查省时间。
常见问题
Q: 挂了代理一定比直连慢吗?
多一跳中转确实有额外开销,但差距通常在几十毫秒级别,如果节点线路比你的直连路由更顺,甚至可能更快。挂代理后速度大幅下降,基本就是节点选得远、连接没复用、超时设太长这三个原因,挨个排查就能解决。
Q: 并发到底开多少合适?
没有标准答案,跟带宽、目标站承受能力、代理套餐都有关系。实用做法是从 50 起步,每轮加 20%,同时盯错误率,一旦超过 5% 就退回上一档。稳定运行比激进加压重要,抖动大的并发设置平均速度反而更慢。
Q: 同一个节点白天快、晚上慢,怎么办?
这是晚高峰线路拥挤导致的。两个办法:一是把对速度敏感的任务挪到白天跑;二是准备几个候选节点,从监控里发现平均耗时抬升,就让程序自动获取新的IP,落到备用节点上继续跑,全程不用人工盯。
Q: 优化都做完了,还有提速空间吗?
看瓶颈在哪。如果测出来是目标站本身响应慢,代理侧能做的有限;这种情况下把重试逻辑改成"快速失败、立刻获取新的IP再试",减少在慢请求上的等待,整体吞吐量反而会提上来。另外记得定期回看监控曲线,用量趋势里往往藏着新的优化点。






