轮换代理(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
相关产品推荐
相关产品推荐

