如何在代理访问站点失败后重复执行检测?代码问题求助
代理访问失败自动重试的实现方案
原代码问题分析
- 访问失败后直接切换代理,没有对当前代理进行重试
- 未处理代理列表索引越界的情况
- 异常捕获过于宽泛,无法定位具体失败原因
- 无超时设置,可能导致请求长时间挂起
修改后的实现代码
import requests from requests.exceptions import RequestException # 读取代理列表,自动过滤空行和无效内容 with open("valid_proxies.txt", "r") as f: proxies = [proxy.strip() for proxy in f.read().splitlines() if proxy.strip()] sites_to_check = ["https://open.spotify.com/"] max_retries_per_proxy = 3 # 单个代理最多重试3次 max_proxy_attempts = len(proxies) # 最多尝试所有代理 for site in sites_to_check: proxy_idx = 0 access_success = False # 循环尝试代理,直到成功或用完所有代理 while proxy_idx < max_proxy_attempts and not access_success: current_proxy = proxies[proxy_idx] proxy_config = {"http": current_proxy, "https": current_proxy} # 对当前代理进行多次重试 for try_num in range(1, max_retries_per_proxy + 1): try: print(f"[{site}] 第{try_num}次尝试 | 代理: {current_proxy}") # 设置10秒超时,避免请求卡住 response = requests.get(site, proxies=proxy_config, timeout=10) response.raise_for_status() # 主动抛出HTTP错误状态码异常 print(f"✅ 访问成功!状态码: {response.status_code}") # print(response.text) # 按需打印响应内容 access_success = True break except RequestException as err: print(f"❌ 第{try_num}次失败: {str(err)}") # 重试次数耗尽时,切换下一个代理 if try_num == max_retries_per_proxy: print(f"代理 {current_proxy} 重试次数用完,切换下一个") proxy_idx += 1 if not access_success: print(f"⚠️ 所有代理尝试完毕,无法访问站点: {site}")
关键改进点
- 单代理重试机制:通过内层循环实现单个代理的多次重试,避免一次失败就直接换代理
- 精准异常捕获:只捕获
RequestException及其子类,能明确区分超时、连接失败、HTTP错误等问题 - 代理列表预处理:自动过滤空行,避免无效代理导致的错误
- 超时控制:设置10秒超时,防止请求长时间挂起占用资源
- 边界安全:通过
max_proxy_attempts限制代理尝试数量,避免索引越界 - 状态标记:用
access_success标记访问状态,清晰控制循环逻辑
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

