代理池为什么需要存活检测
免费与低价代理的失效速度以分钟计,把死 IP 留在池子里,业务侧就会不断拿到连接超时。一套存活检测脚本能周期性体检全部节点,把不可用 IP 挡在分发之前,是维护代理池最核心的组件,也是采集任务稳定运行的前提。
脚本设计要点
- 并发探测:串行检测上千代理耗时过长,用线程池或异步 IO 并发发起请求。
- 双段超时:连接超时 3 秒、读取超时 5 秒,避免单个慢节点拖垮整轮检测。
- 重试判定:连续两轮失败才判死,单次抖动只做降权观察。
- 结果分级:区分"连接失败"与"返回异常状态码",前者直接剔除,后者标记限流。
Python 示例代码
下面用 requests 加线程池实现一个最小可用版本:
import requests
from concurrent.futures import ThreadPoolExecutor
PROXIES = ["http://1.2.3.4:8080", "http://5.6.7.8:3128"]
TEST_URL = "https://httpbin.org/status/200"
def check(proxy):
try:
r = requests.get(TEST_URL, proxies={"http": proxy, "https": proxy},
timeout=(3, 5))
return proxy, r.status_code == 200
except Exception:
return proxy, False
with ThreadPoolExecutor(max_workers=20) as ex:
for proxy, ok in ex.map(check, PROXIES):
print(proxy, "OK" if ok else "DEAD")
把 PROXIES 换成从 Redis 或文本文件读取的池子,检测循环挂到 crontab 每 五 分钟执行一次,就是一个简易的探活服务。判定 URL 建议指向自家轻量页面,避免长期请求第三方接口被限流误杀。
超时阈值怎么定
- 先用小样本统计正常代理的连接耗时分布,取 P90 再上浮一档作为连接超时。
- 读取超时按目标页大小与出口带宽估算,静态页 5 秒已经足够宽松。
- 阈值过松会放行慢节点拖累业务,过紧会误杀可用资源,需按线上数据回归调整。
剔除与回补机制
- 自动摘除:连续失败达到阈值,立即从可用队列移除并记录失败原因。
- 冷静回补:被剔除的 IP 隔半小时低频复测,恢复即回池并降权运行。
- 指标监控:统计每轮存活率曲线,骤降时触发告警提醒补充新资源。
Article ID: 97
(本文仅供技术交流,请遵守法律法规)