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

轮换代理(Rotating proxies)未在Python requests请求中生效如何解决

问题排查与修复方案

核心问题原因

  • 代理值未正确赋值到实例属性:你调用self.proxies()方法时仅返回了新代理值,没有将返回值赋值给self.proxy,导致请求时一直使用初始化的空代理值
  • 代理格式不符合requests要求:requests的proxies参数需要传入字典格式,直接传入代理字符串会触发属性不存在的报错
  • 旧代码代理读取逻辑冗余:旧代码读取代理文件时用split(',')处理导致每个代理被封装为列表,还残留换行符,第一次修改用strip()处理是正确的

修复代码

首先修改proxies方法,生成符合要求的代理字典并自动更新实例属性:

def proxies(self):
    if self.proxyCount > 0:
        self.proxyCount += 1
    # 随机选代理,拼接为requests要求的字典格式
    proxy_str = random.choice(self.proxyList)
    self.proxy = {
        "http": f"http://{proxy_str}",
        "https": f"http://{proxy_str}"
    }
    print('proxy updated: ', self.proxy)

然后调整checkAccounts方法中的调用逻辑,不需要接收返回值,调用self.proxies()就会自动更新self.proxy:

def checkAccounts(self):
    # 启动前先初始化一次代理
    self.proxies()
    while not self.usernames.empty():
        name = self.usernames.get(); self.usernames.put(name)
        url = f"https://public-ubiservices.ubi.com/v3/profiles?nameOnPlatform={name}&platformType=uplay"
        try:         
            r = requests.get(url, headers=self.headers, proxies=self.proxy)
            
            # 每100次请求切换一次代理
            if self.checkedCount % 100 == 0:
                self.proxies()

            ctypes.windll.kernel32.SetConsoleTitleW(f"Gx | Checked: {self.checkedCount}, Available: {self.availableCount}, Errors: {self.errorCount}")
            if r.status_code == 200:
                self.checkedCount += 1
                if len(r.json()['profiles']) != 0:
                    print(f"{Fore.LIGHTBLACK_EX}[+]{Fore.RESET} Taken:          {name}")       
                else:  
                    print(f"{Fore.LIGHTBLACK_EX}[+]{Fore.RESET} Available:      {name}")
                    self.availableCount += 1

            if r.status_code == 429:
                self.errorCount += 1
                print(f"{Fore.LIGHTBLACK_EX}[+]{Fore.RESET} Error:          Rate limited")
                # 触发限流直接切换代理
                self.proxies()
        
        except Exception as e:
            self.errorCount +=1
            print(f"请求错误: {str(e)}")
            # 报错也切换代理
            self.proxies()

其他注意事项

  • 不要使用裸except,捕获具体异常可以快速定位请求过程中的其他问题
  • 如果你的代理需要认证,代理字符串格式为用户名:密码@代理地址:端口
  • 建议初始化时就调用一次self.proxies(),避免第一次请求无代理可用

内容的提问来源于stack exchange,提问作者user16246484

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:15:00