Python 中使用代理IP轮换时,如何避免重复使用已失效的代理?

Python 中使用代理IP轮换时,如何避免重复使用已失效的代理?

我在使用 Python 编写爬虫程序时,需要通过代理IP轮换来发起请求。目前我维护了一个代理IP列表,采用简单的轮换策略(如 itertools.cycle 或随机选择)。但遇到以下问题:

  1. 某个代理IP失效后,程序仍然会继续使用它,导致重复失败
  2. 如何高效地检测并剔除失效代理?
  3. 对于大量代理(例如上千个),如何设计一个性能较好的代理池管理方案?
    我希望了解一种代理池管理机制,能够
  4. 自动检测代理是否可用
  5. 剔除失效或质量差的代理
  6. 对失效代理进行冷却或重试机制(而非直接永久剔除)

运行环境

项目版本
操作系统Ubuntu 22.04
Python3.10+
依赖库requests, aiohttp, threading 或 asyncio

当前代码示例
以下是我当前采用的简单轮换实现:

import requests
from itertools import cycle

PROXY_LIST = [
    'http://proxy1:8080',
    'http://proxy2:8080',
    'http://proxy3:8080',
]

def fetch_with_rotation(url: str):
    proxy_cycle = cycle(PROXY_LIST)
    for _ in range(len(PROXY_LIST)):
        proxy = next(proxy_cycle)
        proxies = {'http': proxy, 'https': proxy}
        try:
            response = requests.get(url, proxies=proxies, timeout=5)
            if response.status_code == 200:
                return response.text
        except requests.exceptions.RequestException:
            continue  # 失败就继续尝试下一个
    return None

result = fetch_with_rotation('https://httpbin.org/ip')
print(result)

当前代码的问题:

  • 每次请求都从列表开头轮换,无法记住哪些代理已失效
  • 如果某个代理永久失效,每次轮换到它都会浪费一次请求时间
  • 缺乏对代理质量的评估(如响应速度、成功率)
    期望结果
    我希望获得一个改进后的代理管理方案,包含以下特性:
  • 代理健康检查:可以定期在后台检测代理可用性(例如每5分钟检测一次)
  • 失效剔除机制:连续失败 N 次后,将该代理移出可用池(或标记为冷却)
  • 代理评分/排序:根据响应时间、成功率等指标,优先使用质量高的代理
  • 线程安全:如果需要在多线程环境中使用,需考虑并发安全
    如果能够提供一个完整的代码示例(包含上述特性),将非常有帮助。也可以推荐一些成熟的 Python 代理池库(仅限开源技术方案,不征询商业产品)。