如何验证requests会话是否成功调用代理并通过代理发起请求?
嘿,第一次尝试代理相关开发完全不用不好意思!我来帮你梳理怎么确认代理是否真的被使用,顺便也指出你代码里的几个小问题~
一、怎么验证请求是否通过代理发送
这里有几个简单直接的方法,按优先级排序:
1. 调用返回当前IP的API(最直观)
把你请求的URL换成能返回当前访问IP的接口,比如http://httpbin.org/ip或者http://icanhazip.com,打印返回结果就能看到请求用的是哪个IP——如果是代理的IP,说明代理生效了。
示例代码片段:
# 在你的runit函数里,把r = s.get(url)改成: r = s.get('http://httpbin.org/ip') print(f"当前请求使用的IP: {r.json()}")
如果返回的IP和你自己的公网IP不一样,而是代理的IP,那肯定是走了代理。
2. 开启Requests的调试日志
让Requests打印出请求的详细过程,包括代理的使用情况。在代码开头加上这段日志配置:
import logging import http.client http.client.HTTPConnection.debuglevel = 1 logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True
运行代码后,你会在控制台看到类似这样的日志:
CONNECT proxy.example.com:8080 HTTP/1.1
这就说明请求正在尝试连接代理服务器,证明代理被使用了。
3. 用抓包工具监控流量
比如用Wireshark、Charles或者Fiddler这类抓包工具,查看请求的目标地址——如果请求是发往代理服务器的IP和端口,而不是直接发往目标网站,那就说明代理生效了。
4. 故意使用无效代理测试
找一个肯定不能用的代理(比如127.0.0.1:9999,如果你本地没开这个端口的服务),如果代码抛出ProxyError,就说明程序确实在尝试使用代理;如果没报错直接请求成功,那说明代理没生效。
二、你的代码里需要调整的几个小问题
看了你的代码,有几个细节可能会影响代理的使用或者导致报错:
- 变量名冲突:
setProxy函数里定义了局部变量proxies,和全局的proxies重名了,虽然这里不会直接导致代理失效,但容易混淆,建议把函数里的变量名改成session_proxies之类的。 - 未定义的变量/函数:
url变量在runit函数里没定义,会导致报错;passwd(proxies)这个函数没有实现,调用会报错;- 最后一行
print("Does it actually use the proxy or not?"少了闭合的括号)。
- Session的复用:你的代码里每次调用
setProxy都会创建新的Session,这没问题,但要确保后续的get和post都用同一个Session对象(你现在是这么做的,这点是对的)。
调整后的setProxy函数示例:
def setProxy(proxy): s = requests.Session() # 重命名局部变量,避免和全局proxies冲突 session_proxies = {'http': f'http://{proxy}', 'https': f'http://{proxy}'} s.proxies.update(session_proxies) return s
总结
先试试用httpbin.org/ip查看IP的方法,这是最快验证代理是否生效的方式。同时把代码里的报错点修复掉,就能更顺畅地测试啦!
内容的提问来源于stack exchange,提问作者CDNthe2nd

