You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:15:03