Python使用Requests配置HTTP代理请求失效问题咨询
为什么设置HTTP代理后请求HTTPS网站仍暴露真实IP?
问题描述
我编写了如下Python代码,期望通过指定的HTTP代理发送请求后,print输出代理IP 203.92.33.87,但实际打印的是我的真实公网IP,请协助排查原因:
import requests proxies = {'http': '203.92.33.87:80'} # Creating the session and setting up the proxies. s = requests.Session() s.proxies = proxies # Making the HTTP request through the created session. r = s.get('https://www.trackip.net/ip') # Check if the proxy was indeed used (the text should contain the proxy IP). print(r.text)
问题分析与解决方案
我一眼就发现了问题的核心:你只配置了http协议的代理,但你发起的是HTTPS请求(目标URL以https://开头)。requests库的代理配置是按协议区分的——http字段的代理只会对http://开头的请求生效,对于https://请求,它会去查找proxies字典里的https字段,如果没有配置,就直接走默认网络连接,自然就暴露了你的真实IP。
下面是具体的解决步骤:
补充HTTPS代理配置:
最简单的方法是在proxies字典里同时添加https协议的代理项,和HTTP代理使用同一个地址(前提是你的代理服务器支持HTTPS流量转发):proxies = {'http': '203.92.33.87:80', 'https': '203.92.33.87:80'}验证代理服务器的HTTPS支持:
有些HTTP代理只支持转发HTTP流量,无法处理HTTPS请求的CONNECT方法。如果补充配置后还是不行,你需要确认这个代理服务器是否支持HTTPS访问——可以用curl测试:curl -x 203.92.33.87:80 https://www.trackip.net/ip如果返回错误,说明这个代理不支持HTTPS,你需要更换支持HTTPS的代理。
排查环境变量冲突:
如果你的系统环境中设置了HTTP_PROXY或HTTPS_PROXY环境变量,requests会优先使用这些全局代理,覆盖你在session里设置的配置。可以通过禁用环境变量代理来解决:s = requests.Session() s.trust_env = False # 禁用环境变量中的代理配置 s.proxies = proxies
修改后的完整代码
import requests # 同时配置HTTP和HTTPS代理 proxies = {'http': '203.92.33.87:80', 'https': '203.92.33.87:80'} s = requests.Session() s.proxies = proxies # 可选:禁用环境变量代理(如果存在冲突的话) # s.trust_env = False r = s.get('https://www.trackip.net/ip') print(r.text)
内容的提问来源于stack exchange,提问作者user3143781
相关产品推荐
相关产品推荐

