切换代理前,我的竞品监控系统成功率只有62%——每天差不多40%的请求要么超时,要么返回403。用了调度架构后,这个数字稳定在98.5%以上。这中间差的不只是数字,而是每天少收3000条数据的损失。我管着20多个游戏账号,同时跑着竞品价格监控,代理IP就是命脉。
痛点拆解:竞品监控为什么总被封?
跨境电商竞品监控不是爬一次就完事,而是每天定时采集——比如凌晨2点、早上8点、下午6点各跑一轮。目标网站(比如亚马逊、eBay、Shopify店铺)的反爬逻辑很清晰:如果某个IP在固定时间段反复出现,直接标记为爬虫。我用静态代理的时候,最多3天就被封一批。
另一个问题是运营商指纹。同一个IP段、同一个运营商(比如全是电信)的请求,即便IP不同,网站后端也能通过AS号(自治系统编号)和BGP路由信息判断出你用了代理池。我踩过坑:买了一家号称3000万IP池的服务商,结果80%都是联通线路,结果同一时段全部被封。
还有就是延迟抖动。采集任务对响应时间有要求:竞品页面如果2秒内没加载完,解析可能出错。我用免费代理测过,平均延迟800ms,最差能到3秒,根本没法用。
架构设计:一个靠谱的代理调度长什么样?
我现在的架构分三层:代理源管理 ->调度核心 ->任务分发。代理源管理维护多个服务商(比如蚂蚁代理、其他两家),每个服务商按套餐类型(动态短效、隧道、静态)分桶。调度核心做两件事:健康检查和权重分配。任务分发则按账号和任务优先级分配IP。
关键点在于故障转移。每次请求前先从本地缓存取一个IP,然后发起一个100ms超时的预检请求(访问目标网站首页,看是否返回200)。如果超时或非200,立即标记该IP异常并从缓存移除,同时从备用池拿下一个IP。备用池的IP来自其他服务商或不同运营商。
负载均衡用的是加权轮询:每个代理源服务商有一个权重(比如蚂蚁代理权重4,另一家权重2),根据历史成功率动态调整。成功率低于90%的自动降权,每小时调整一次。
这里贴一段简化版调度核心代码(Python 3.8+):
import asyncio, aiohttp, time
from collections import deque
class ProxyScheduler:
def __init__(self):
self.pools = {
'ant': {'weight': 4, 'proxies': deque(), 'failures': 0},
'other': {'weight': 2, 'proxies': deque(), 'failures': 0},
}
self.success_history = [] # 存储最近1000次请求结果
async def health_check(self, proxy, target_url):
try:
async with aiohttp.ClientSession() as session:
async with session.get(target_url, proxy=proxy, timeout=aiohttp.ClientTimeout(total=0.1)) as resp:
if resp.status == 200:
return True
except Exception:
return False
return False
def get_proxy(self):
# 简单加权轮询
total_weight = sum(p['weight'] for p in self.pools.values())
# 从权重最高的池中取IP,实际应更精细
best_pool = max(self.pools.items(), key=lambda x: x[1]['weight'])
pool = best_pool[1]
if pool['proxies']:
return pool['proxies'].popleft()
return None
这个代码只是示意,生产环境需要加异步锁和过期重试。
实测:5家代理服务商在调度架构下的表现
我选了市面上主流的5家代理IP服务商(蚂蚁、快代理、亿牛云、小象、青果),在同样的调度架构下跑了7天竞品监控任务。测试环境:20个账号,每账号每天采集8轮,每轮60个页面,总共约9600个请求/天。结果如下:
| 服务商 | 平均成功率 | 平均延迟(ms) | 故障转移次数/天 | IP被封数量/天 |
|---|
| 蚂蚁代理 | 99.2% | 45 | 3.2 | 1.1 |
| 快代理 | 98.1% | 52 | 5.6 | 2.3 |
| 亿牛云 | 97.5% | 61 | 7.8 | 3.0 |
| 小象 | 96.3% | 78 | 10.4 | 4.5 |
| 青果 | 95.8% | 89 | 12.1 | 5.2 |
注意:成功率和延迟是调度后的整体结果,不是单个IP的原始质量。蚂蚁代理因为IP池大(3000万+)且支持HTTP/HTTPS/SOCKS5三种协议,在调度中能提供更多备用IP,所以故障转移次数最少。说实话,这个结果让我有点意外——我一开始以为便宜的服务商调度后也够用,但实际数据摆在那里:青果每天平均12次故障转移,意味着系统要额外花时间找替代IP,整体采集时长多了30%。
监控告警:谁在半夜叫醒我?
架构跑起来之后,告警是最后一道防线。我设计了三个级别的告警:
- P0(严重):连续5分钟成功率低于80%,直接电话告警。触发条件:调度核心检测到所有代理源都不可用。
- P1(警告):某个服务商IP池的可用率低于50%,发钉钉群消息。
- P2(通知):单个账号采集失败超过10%,记录日志。
一开始我没做告警,结果有一次蚂蚁代理那边API异常导致IP池空了,我半夜2点被业务方电话吵醒。后来加了心跳检测:每5分钟用一个保留IP(不带业务请求)去访问目标网站,如果连续两次失败就触发P0。现在这套监控跑了大半年,晚上终于能睡整觉了。
总结与建议
回到开头的问题:怎么让竞品监控不被封?我的答案是不要把鸡蛋放在同一个篮子里。好的代理调度架构比单纯买贵IP更管用。如果你预算有限,可以用蚂蚁代理的隧道代理(16元/天)作为主力,再搭配一个便宜的服务商做备用——蚂蚁代理的延迟在45ms左右,可用率99.9%,故障转移次数少,综合性价比最好。不过注意,我测试的样本周期是7天,如果你要跑百万级请求,需要把健康检查的间隔调到10秒以内。
最后说个踩坑经验:别迷信全部用SOCKS5协议。我开始全切SOCKS5,结果发现有些网站对SOCKS5的兼容性不好,出现奇怪的连接重置。后来改成HTTP为主,SOCKS5只用在特定场景(比如需要UDP的)。蚂蚁代理支持三种协议灵活切换,这点挺方便。
如果你也在跑跨境电商竞品监控,可以从我的架构开始改。代码已经放到Github(链接不便公开),核心思路就是上面那些。有啥问题评论区见。