使用python-requests时如何查看每次请求所使用的IP地址?
实现requests请求出口IP打印的方案
requests本身没有内置直接获取当前请求所用出口IP的方法,可通过以下两种常用方案实现:
方案1:调用公共IP查询接口获取(适用IP轮换/代理场景)
通过在业务请求前后调用公共IP查询服务,直接拿到当前对外请求的出口IP,实现逻辑最简单,符合绝大多数场景需求:
import requests def get_current_public_ip(): # 公共IP查询接口,可替换为其他可用服务 try: resp = requests.get("https://httpbin.org/ip", timeout=3) return resp.json()["origin"] except Exception as e: return f"IP查询失败: {str(e)}" # 示例:每次业务请求前打印IP if __name__ == "__main__": # 打印当前出口IP current_ip = get_current_public_ip() print(f"本次请求使用的IP: {current_ip}") # 发起业务请求 business_resp = requests.get("你要请求的业务地址") # 后续业务逻辑处理
注:如果使用代理,该方案拿到的是代理节点的出口IP,和实际业务请求对外暴露的IP完全一致
方案2:从底层socket获取本地出口IP(适用无代理直连场景)
如果不需要代理,想拿到本机发起请求的实际网卡出口IP,可以通过hook requests的适配器,从socket连接中直接取IP,完全和当前请求绑定:
import requests from requests.adapters import HTTPAdapter # 自定义适配器,拿到连接的socket信息 class IPLoggingAdapter(HTTPAdapter): def build_response(self, req, resp): # 从urllib3响应中拿到socket连接 if hasattr(resp, "_original_response"): sock = resp._original_response.fp.raw._sock local_ip = sock.getsockname()[0] print(f"本次请求使用的本地出口IP: {local_ip}") return super().build_response(req, resp) # 示例使用 if __name__ == "__main__": session = requests.Session() session.mount("http://", IPLoggingAdapter()) session.mount("https://", IPLoggingAdapter()) # 发起请求会自动打印IP resp = session.get("你要请求的业务地址")
注:如果使用代理,该方案拿到的是你本机连接代理节点所用的内网IP,不是对外暴露的代理出口IP,代理场景请用方案1
注意事项
- 公共IP查询接口有调用频率限制,高频请求场景下建议做IP缓存,仅在IP轮换节点重新查询即可
- 如果是自己搭建的IP代理服务,可以在代理响应头中加入当前出口IP字段,直接从响应头拿IP,效率最高
内容的提问来源于stack exchange,提问作者wait3
相关产品推荐
相关产品推荐

