背景之前做工业数据采集项目时需要爬取30设备厂商的公开接口数据平均每天被封IP超过50个Cookie失效次数超过100次经常导致采集任务中断。折腾了2个月搭了这套双池架构上线后稳定运行了8个月零任务中断IP利用率提升了3倍。一、核心痛点分析先说说之前踩过的坑你肯定也遇到过代理质量参差不齐免费代理90%以上不可用付费代理经常出现断供、复用导致被封Cookie生命周期混乱不同网站Cookie有效期从几分钟到几天不等手动维护完全不现实切换策略简单粗暴之前只要请求失败就换代理换Cookie导致大量有效代理被浪费没有容灾机制代理池挂了整个爬虫集群就直接瘫痪数据采集中断二、整体架构设计我最终落地的架构非常轻量不需要复杂的中间件单机就能扛住每秒1000次的代理/Cookie查询请求爬虫节点集群双池调度服务代理池子集群Cookie池子集群代理采集模块代理校验模块代理生命周期管理Cookie采集模块Cookie校验模块Cookie自动刷新模块监控告警模块核心模块分工调度服务统一接收爬虫节点的代理/Cookie申请请求根据域名、请求类型分配最优的代理Cookie组合代理池负责代理的采集、校验、分级把代理分成「高匿可用」「临时可用」「不可用」三个等级优先分配高匿代理Cookie池负责Cookie的登录、校验、自动刷新每个域名维护独立的Cookie池根据活跃度动态调整数量监控模块监控代理存活率、Cookie有效率、请求成功率低于阈值自动告警还能自动扩容代理采集节点三、核心功能实现1. 代理池的分级校验逻辑我设计了三层校验确保给爬虫的代理都是可用的# 代理校验核心逻辑asyncdefvalidate_proxy(proxy,target_domain):# 第一层连通性校验请求百度看能不能通try:asyncwithaiohttp.ClientSession()assession:asyncwithsession.get(https://www.baidu.com,proxyproxy,timeout5)asresp:ifresp.status!200:returnFalseexcept:returnFalse# 第二层目标域名专属校验确保代理能访问目标网站try:asyncwithaiohttp.ClientSession()assession:asyncwithsession.get(fhttps://{target_domain}/favicon.ico,proxyproxy,timeout10)asresp:ifresp.statusin[403,404,503]:returnFalseexcept:returnFalse# 第三层匿名性校验确保代理不会暴露真实IPtry:asyncwithaiohttp.ClientSession()assession:asyncwithsession.get(https://api.ipify.org,proxyproxy,timeout5)asresp:ipawaitresp.text()ifipLOCAL_IP:# 真实IP暴露了不是高匿代理returnFalseexcept:returnFalsereturnTrue校验通过的代理会加入高匿池优先级最高如果只有第二层校验通过加入临时池只有高匿池用完了才会分配。2. Cookie池的自动刷新机制每个Cookie我都维护了完整的生命周期classCookieItem:def__init__(self,cookie_str,domain):self.cookie_strcookie_str self.domaindomain self.created_timedatetime.now()self.last_used_timedatetime.now()self.use_count0self.success_rate1.0self.is_validTrue# 自动判断是否需要刷新defneed_refresh(self):# 使用率低于80%直接标记失效ifself.success_rate0.8:returnTrue# 超过24小时自动刷新if(datetime.now()-self.created_time).total_seconds()86400:returnTrue# 使用超过100次自动刷新ifself.use_count100:returnTruereturnFalse我还写了自动登录脚本Cookie需要刷新的时候自动调用登录接口生成新的Cookie完全不需要人工干预。我这边工业设备网站的登录大多是账号密码登录自动登录脚本非常好写几乎不需要验证码。四、线上踩坑经验代理校验频率太高导致被封最开始我每10分钟校验一次所有代理结果被好多代理服务商封了IP后来改成每30分钟校验一次只校验最近1小时被使用过的代理就没问题了Cookie复用太高导致串号最开始同一个Cookie同时给10个爬虫节点用结果出现了用户数据串号的问题后来改成同一个Cookie同时最多给3个节点用就没问题了调度服务单点故障最开始调度服务是单点的挂了整个集群就瘫了后来改成主备模式挂了自动切换再也没出过问题五、效果总结这套架构上线后代理存活率从30%提升到95%以上Cookie有效率从40%提升到90%以上爬虫任务中断率从20%降到0%代理采购成本减少了60%下一篇我会讲基于这套双池架构怎么实现单机日采百万级数据的高并发爬虫优化方案。