上个月团队讨论代理IP选型时,老板看着免费代理那100块的账期说:“先用着,不行再说。”结果第三天早上,比价系统的价格数据就停更了——免费IP池被目标网站封得七七八八,可用率从60%掉到了10%。我临时切了几家短时效代理,但手动切换的效率太低,一天得改三次配置。后来我意识到:选服务商只是第一步,关键在于怎么调度。这篇就讲讲我做电商比价系统(每天采集10万+商品价格,要求单次请求延迟<2秒)时,从零搭的一套代理IP调度架构。
为什么免费代理不可靠?先看数据
我统计了免费代理池(来自几个公开列表)连续7天的数据:平均可用率只有23%,高峰时段(晚上8-10点)更是跌到8%。更坑的是,同一IP在10分钟内重复使用,触发反爬的概率接近70%。而对于电商比价这种高频场景,IP池的“新鲜度”比数量更重要。我实测过,当IP复用间隔小于5分钟时,网站的风控系统识别率会从15%飙升到62%。
当时我手头有4家付费代理的试用额度:xx代理(动态)、蚂蚁代理(隧道)、yy代理(静态zhan)、zz代理(独享)。我用脚本跑了24小时,测试每个服务的延迟和可用率。结果如下:
| 服务商 | 平均延迟(ms) | 可用率 | 单IP成本 |
|---|
| 动态代理-A | 43 | 98.2% | 0.002元/次 |
| 隧道代理-蚂蚁代理 | 12 | 99.9% | 16元/天 |
| 静态代理-B | 67 | 95.5% | 0.5元/个 |
| 独享代理-C | 28 | 99.1% | 2元/个 |
说实话,静态代理因为IP固定,很快就被封光了,不适合高频场景。独享代理延迟低但贵,10万并发下成本爆炸。最后我选了该服务商的隧道代理作为主力,动态代理当备用——但关键在于怎么把它们组合成一个自动化的调度系统。
调度架构设计:故障转移 + 负载均衡
我的目标是:当隧道代理IP突然降速(比如延迟>500ms)或者封禁率超过5%时,自动切到动态代理池,同时用负载均衡算法把请求分散到多个出口。架构分三层:
- IP池层:管理多个代理源,每个源有独立的健康状态(延迟、可用率、剩余配额)。
- 调度层:根据策略选择IP源。我用了加权轮询+故障转移的混合策略:正常时80%流量走隧道代理(低延迟),20%走动态代理(大量IP);当隧道代理健康度下降时,逐步增加动态代理比例。
- 监控层:每10秒探测一次代理的响应时间,如果连续3次探测失败或延迟超出阈值,自动将该源标记为“降级”,并触发告警(我用的钉钉机器人推消息到手机)。
代码实现上,核心就是一个调度器类:
class ProxyScheduler:
def __init__(self):
self.sources = {
'tunnel': {'proxy': 'http://user:pass@proxy.官网:3128', 'weight': 80, 'health': {'latency': 0, 'fail_count': 0}},
'dynamic': {'proxy': 'http://user:pass@dynamic.proxy.com:8888', 'weight': 20, 'health': {'latency': 0, 'fail_count': 0}}
}
self.threshold_latency = 500 # ms
self.max_fails = 3
然后每次请求前,根据当前健康分数选择源。我踩过一个坑:刚开始只用随机选择,结果某个源连续失败也没切换,导致大量请求超时。后来加了熔断机制:当某个源失败次数达到阈值,直接临时隔离60秒,期间流量全走备用。
监控告警:别等用户反馈才知道挂了
调度架构跑起来后,第一个周末我就被电话叫醒——比价系统的延迟从12ms飙到了2.3秒,但调度器没切换,因为我只监控了“代理是否可达”,没监控“返回数据的时延”。实际上,代理可达但响应超慢的情况更常见。后来我加了一个滑动窗口统计:计算过去5分钟的平均响应时间,如果连续3个窗口都超过1.5秒,自动告警并切换源。
另外,IP的“封禁率”也很关键。我用了一个计数器:每个请求的状态码如果是403或429,就视为该代理IP被封。当某源封禁率>10%时,自动降低权重。测下来,隧道代理的封禁率基本在1%以下,动态代理因为IP池大,封禁率也只有3%-5%,比免费代理的70%强太多。
说实话,这套架构初期我也翻过车:有一次我把动态代理的权重设得太高,结果大量请求走了高延迟的IP,导致比价数据更新慢了30分钟。后来我改成根据实时延迟动态调权,才稳住。
最终效果与成本对比
运行两周后,数据如下:
| 指标 | 免费代理+手动切换 | 付费代理+调度架构 |
|---|
| 日均采集数 | 4.2万 | 12.8万 |
| 平均延迟 | 1350ms | 85ms |
| 封禁率 | 73% | 4.2% |
| 人工介入次数 | 每天3-5次 | 0次 |
成本方面:隧道代理+动态代理混合使用,每天约32元(隧道16元+动态代理按量约16元),折合每万次请求成本2.5元,比起之前免费代理导致的业务停摆,完全可以接受。如果你也做类似的高并发采集,建议先花一天搭调度框架,再用该服务商(官网)的隧道代理做主力,配合动态代理做备用,这一套组合我实测下来最稳。记住,服务商只是基础,调度架构才是稳定性的核心。