You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Requests库搭配代理无法切换IP的问题排查

代理未生效的问题排查与修复

你的代码核心问题是ProxyManager类的逻辑错误,导致实际没有加载可用的代理列表,自然无法切换代理IP。以下是具体问题和修复方案:

问题点分析

  1. _filter_proxies方法清空了代理列表
    初始化时self._proxie_data是空列表,开启debug模式后,循环遍历空列表不会生成任何代理项,最终把原本从proxies.txt读取的代理列表覆盖成了空数组。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:55:17