Python requests库代理失效问题排查求助
代理请求仍暴露真实IP的排查与替代方案
核心排查点
- 代理格式配置错误:requests的
proxies字典必须明确指定协议,不能只写ip:port。正确格式:
漏写协议头会导致请求直接走本地网络。proxies = { 'http': 'http://x.x.x.x:port', 'https': 'http://x.x.x.x:port' # 多数HTTP代理可兼容HTTPS请求 } - 代理匿名等级不足:普通透明代理会在请求头中携带
X-Forwarded-For暴露真实IP,必须使用高匿代理,这类代理会完全替换请求源IP,不会泄露真实地址。 - 代理已失效:免费代理存活周期极短,你抓取的代理可能在测试时可用,实际请求时已失效。建议加预验证逻辑:
def validate_proxy(proxy_addr): test_url = 'http://httpbin.org/ip' try: resp = requests.get(test_url, proxies={'http': proxy_addr, 'https': proxy_addr}, timeout=5) # 替换成你的真实IP进行校验 return resp.json()['origin'] != '111.222.333.444' except Exception: return False - 重定向绕过代理:部分检测网站会将HTTP请求重定向到HTTPS,若仅配置了HTTP代理,HTTPS请求会走本地网络。务必同时配置HTTP和HTTPS代理。
- 代码逻辑疏漏:检查是否存在分支逻辑未传入
proxies参数,或变量名拼写错误(比如把proxies写成proxy)。
替代实现方案
如果requests代理始终无法解决问题,可以尝试以下工具:
- curl-cffi:模拟curl的底层逻辑,对代理兼容性更好,支持各类代理协议:
from curl_cffi import requests resp = requests.get('http://httpbin.org/ip', proxies={'https': 'http://x.x.x.x:port'}) print(resp.json()) - Playwright:通过真实浏览器发送请求,代理配置更贴近用户行为,不易被检测绕过:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(proxy={"server": "http://x.x.x.x:port"}) page = browser.new_page() page.goto('http://httpbin.org/ip') print(page.text_content('pre')) browser.close() - aiohttp:异步HTTP库,底层实现与requests不同,可能解决部分兼容性问题:
import aiohttp import asyncio async def fetch_with_proxy(): async with aiohttp.ClientSession() as session: async with session.get('http://httpbin.org/ip', proxy='http://x.x.x.x:port') as resp: print(await resp.json()) asyncio.run(fetch_with_proxy())
内容的提问来源于stack exchange,提问作者user7919275
相关产品推荐
相关产品推荐

