Python爬虫代理IP池怎么设计:动态调度与失败剔除-易代理
单条代理IP 能跑通,不等于生产能跑稳。真实采集里,出口会老化、被限、抖动。必须做代理池,而不是每次请求随机挑一个字符串。
一、代理池不是列表,是带状态的调度器
每个节点要记录:
总请求数
成功数
连续失败数
最近耗时
最后成功时间
所属地区
用 dataclass 维护:
python@dataclassclass ProxyStats: url: str total: int = 0 ok: int = 0 latencies: deque = field(default_factory=lambda: deque(maxlen=50))
选节点时按成功率与 P95 耗时综合打分,别轮询瞎选。
二、预取与补充机制
别每次请求都调提取 API,延迟会炸。启动预取 50~100 条放内存队列:
pythonproxy_queue = load_proxies(batch=80)
消费到阈值(如剩 20 条)再补一批。动态代理IP 网关也同理,本地做二级缓存。
三、失败剔除与冷却恢复
连续失败 3 次进冷却,不是永久删:
pythonif node.fail_streak >= 3: node.cool_until = time.time() + 60
冷却后小流量回测,成功再恢复权重。这样比“失效就扔”省资源。
四、按目标站分池
不同目标站风控强度不同。价格页、搜索页、接口页分开:
重点站:固定出口 + 低并发
广采站:动态出口 + 中并发
测试流量:独立小池
混用会一个脏任务拖垮全局。
五、轮换频率匹配场景
风控松的站,每百请求换一次;严的站,每 20~50 请求换。别默认“每次请求都换”,换太猛会话断、命中率掉。
代理IP 池的价值,不是 IP 多,是让“对的出口在合适的时间被用对”。