三种适配不同业务场景的代理IP可用性检测Python实现方案 技术分享 2026-03-17 01:15:06 代理IP HTTP代理 代理IP池 爬虫代理 动态代理 代理IP的可用性直接影响业务的稳定运行,下面为你介绍从简单到复杂的三种代理IP可用性检测方法,满足不同规模和需求的检测场景。  ## 基础版:使用requests库批量检测代理IP 适合快速批量初筛代理IP的基础场景,通过多线程并发实现高效检测,能快速筛选出可用代理并按响应时间排序。 ```python import requests from concurrent.futures import ThreadPoolExecutor, as_completed import time def check_proxy(proxy, timeout=5): """ 检测单个代理是否可用 :param proxy: 代理地址,格式如 'http://127.0.0.1:8080' :param timeout: 超时时间 :return: (代理, 是否可用, 响应时间) """ test_url = 'http://httpbin.org/ip' # 测试网站 proxies = { 'http': proxy, 'https': proxy } try: start_time = time.time() response = requests.get(test_url, proxies=proxies, timeout=timeout) elapsed_time = time.time() - start_time if response.status_code == 200: return (proxy, True, round(elapsed_time, 3)) else: return (proxy, False, None) except: return (proxy, False, None) def check_proxies_batch(proxies, max_workers=10): """ 批量检测代理 """ valid_proxies = [] with ThreadPoolExecutor(max_workers=max_workers) as executor: # 提交所有任务 future_to_proxy = { executor.submit(check_proxy, proxy): proxy for proxy in proxies } # 收集结果 for future in as_completed(future_to_proxy): proxy, is_valid, response_time = future.result() if is_valid: valid_proxies.append((proxy, response_time)) print(f"✓ 可用代理: {proxy} (响应时间: {response_time}s)") else: print(f"✗ 不可用代理: {proxy}") # 按响应时间排序 valid_proxies.sort(key=lambda x: x[1]) return valid_proxies # 使用示例 proxies_list = [ 'http://127.0.0.1:8080', 'http://192.168.1.1:8080', 'http://10.0.0.1:3128' ] valid_proxies = check_proxies_batch(proxies_list) print(f"\n可用代理数量: {len(valid_proxies)}") for proxy, response_time in valid_proxies: print(f"{proxy} - {response_time}s") ``` ## 进阶版:多维度全面检测代理IP 适合需要获取代理详细信息的场景,除了连通性检测,还可验证代理的访问环境一致性,同时支持SOCKS代理类型的检测,搭配日志记录便于排查问题。 ```python import requests import socket import socks import time from concurrent.futures import ThreadPoolExecutor, as_completed from urllib.parse import urlparse import logging # 配置日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') class ProxyChecker: def __init__(self, timeout=5, test_url='http://httpbin.org/ip'): self.timeout = timeout self.test_url = test_url def check_socket_connection(self, proxy): """ 检测代理的socket连接 """ parsed = urlparse(proxy) host = parsed.hostname port = parsed.port or (80 if parsed.scheme == 'http' else 443) try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(self.timeout) result = sock.connect_ex((host, port)) sock.close() return result == 0 except: return False def check_proxy_http(self, proxy): """ 完整的HTTP代理检测 """ proxies = { 'http': proxy, 'https': proxy } try: # 检查socket连接 if not self.check_socket_connection(proxy): return None # HTTP请求测试 start_time = time.time()