代理轮换器
当爬虫需要将请求分散到多个代理,并停止对失效代理的反复使用时,请使用此技能。轮换器会分配下一个健康代理,统计失败次数,并在代理失败过多后将其禁用一段时间(冷却窗口),随后再给它一次机会。您需要自行提供代理列表;本技能不提交任何代理。
何时调用
- 用户说:“轮换代理”、“将请求分散到多个代理”、“避免 IP 被封”、“通过另一个代理重试”。
- 会话中的代码需要发起大量出站请求,并希望将它们分布到一个代理池中。
何时不应调用
- 单个连接即可满足需求,或者目标网站明确允许您的请求量——此时使用代理轮换只会增加不必要的复杂度。
- 意图是绕过明确的封锁或滥用服务;请确保使用行为符合目标网站的使用条款。
具体示例
用户输入:
我有 5 个代理。对它们进行轮询,并跳过任何开始失败的代理。
输出:
import requests
from rotator import ProxyRotator
rot = ProxyRotator.from_env() # PROXY_POOL="http://h1:8080,socks5://h2:1080,..."
for url in urls:
p = rot.get() # 下一个健康代理
try:
r = requests.get(url, proxies=p.as_dict(), timeout=15)
rot.report(p, ok=r.ok) # 将结果反馈给轮换器,以便代理池自我修复
except Exception:
rot.report(p, ok=False) # 失败过多 -> 在冷却窗口内禁用
应用模式
- 从环境变量或已忽略的 git 文件中加载代理——切勿提交真实的代理 URL 或凭据。
- 每次请求后务必调用
report(proxy, ok=...),以便自动禁用失败的代理。 - 根据目标调整
max_fails和cooldown:较短的冷却期可以恢复不稳定的代理,较长的冷却期则可以淘汰性能差的代理。 - 在开始大批量请求前,运行
health_check以预先禁用失效的代理。 - 处理“无健康代理可用”的错误——应当回退并重试,而不是直接导致运行崩溃。
参考文件:assets/rotator.py。
来源
本技能提炼自作者自动化项目的生产实践。v1.0.0。 另见:[[playwright-login-session]]、[[pipeline-orchestrator]]、[[cron-dispatch]]。
→ 使用 Trawlkit 构建完整的可运行机器人。