使用Python Requests库搭配代理无法切换IP的问题排查
代理未生效的问题排查与修复
你的代码核心问题是ProxyManager类的逻辑错误,导致实际没有加载可用的代理列表,自然无法切换代理IP。以下是具体问题和修复方案:
问题点分析
_filter_proxies方法清空了代理列表
初始化时self._proxie_data是空列表,开启debug模式后,循环遍历空列表不会生成任何代理项,最终把原本从proxies.txt读取的代理列表覆盖成了空数组。get_current_proxy方法索引逻辑错误
索引判断条件>= len(self._verified_proxies) - 1会跳过最后一个代理,且初始索引为0时,第一次调用就+1,直接跳过第一个代理,导致代理轮转逻辑异常。
修正后的ProxyManager类
import random import requests class ProxyManager: def __init__(self) -> None: self._verified_proxies = [] self._current_proxy_index = 0 # 读取并格式化代理列表 with open('./proxies.txt', "r") as file: raw_proxies = file.read().strip().split("\n") # 转换成requests要求的键值对格式,同时支持http/https self._verified_proxies = [ {"http": proxy.strip(), "https": proxy.strip()} for proxy in raw_proxies if proxy.strip() ] # 随机初始化起始代理索引 if self._verified_proxies: self._current_proxy_index = random.randint(0, len(self._verified_proxies) - 1) else: raise ValueError("proxies.txt中没有可用的代理") def get_current_proxy(self): # 循环轮转代理索引 proxy = self._verified_proxies[self._current_proxy_index] self._current_proxy_index = (self._current_proxy_index + 1) % len(self._verified_proxies) return proxy # 可选:添加代理验证方法,提前过滤无效代理 def verify_proxy(self, proxy): try: resp = requests.get("https://api.ipify.org", proxies=proxy, timeout=5) if resp.status_code == 200: print(f"代理 {proxy['http']} 验证通过,出口IP: {resp.text}") return True except Exception as e: print(f"代理 {proxy['http']} 验证失败: {str(e)}") return False def filter_valid_proxies(self): valid_proxies = [] for proxy in self._verified_proxies: if self.verify_proxy(proxy): valid_proxies.append(proxy) self._verified_proxies = valid_proxies if not self._verified_proxies: raise ValueError("没有可用的有效代理") self._current_proxy_index = random.randint(0, len(self._verified_proxies) - 1)
正确的调用方式
方式一:每次请求切换代理
import requests class Content: def __init__(self, url, headers): self.proxy_manager = ProxyManager() # 可选:提前验证并过滤代理 # self.proxy_manager.filter_valid_proxies() self.sess = requests.Session() # 获取当前代理并发起请求 proxy = self.proxy_manager.get_current_proxy() resp = self.sess.get(url, headers=headers, proxies=proxy) # 验证代理是否生效 ip_check = self.sess.get("https://api.ipify.org", proxies=proxy) print(f"当前请求出口IP: {ip_check.text}")
方式二:给Session绑定代理(按需切换)
import requests class Content: def __init__(self, url, headers): self.proxy_manager = ProxyManager() self.sess = requests.Session() # 给Session设置初始代理 self.sess.proxies.update(self.proxy_manager.get_current_proxy()) # 发起请求 resp = self.sess.get(url, headers=headers) # 需要切换代理时调用 # self.sess.proxies.update(self.proxy_manager.get_current_proxy())
关键注意事项
- 代理格式必须正确:
proxies.txt中的代理需是http://ip:port或https://ip:port的完整格式,比如http://192.168.1.1:8080。 - 同时设置http/https代理:如果代理支持两种协议,务必在字典中同时配置两个键,避免部分https请求不走代理。
- 优先验证代理:即使你认为代理都可用,实际使用前验证能避免因代理失效导致的问题。
内容的提问来源于stack exchange,提问作者user12649691
相关产品推荐
相关产品推荐

