如何从httpx.get()的响应中获取URL解析的服务器IP?
用httpx请求后获取服务器解析IP
当你执行resp = httpx.get(url)拿到响应后,想获取该URL解析到的服务器IP,可以按以下方式操作:
同步请求的常规方法
直接从响应的extensions属性中获取底层socket连接,再提取远程IP:
import httpx url = "https://example.com" resp = httpx.get(url) # 取出socket连接对象 socket = resp.extensions.get("socket") if socket: # getpeername()返回(IP地址, 端口号)的元组 server_ip, _ = socket.getpeername() print(f"服务器IP:{server_ip}") else: print("无法获取socket连接,可能是使用了HTTP/2协议或连接池复用场景")
应对HTTP/2或连接池复用的情况
如果请求使用HTTP/2协议,或者连接被连接池复用,上面的方法可能失效。这时可以自定义Transport来提前解析并记录IP:
import httpx from httpx import Transport class IPRecordTransport(Transport): def __init__(self, transport: Transport): self.transport = transport self.server_ip = None def handle_request(self, request): # 先解析域名获取IP with httpx.HTTPConnectionPool(request.url) as pool: resolved_list = pool.resolve(request.url) self.server_ip = resolved_list[0].host # 继续处理请求 return self.transport.handle_request(request) # 使用自定义Transport创建客户端 transport = IPRecordTransport(httpx.HTTPTransport()) with httpx.Client(transport=transport) as client: client.get(url) print(f"服务器IP:{transport.server_ip}")
异步请求的处理方式
异步场景下逻辑类似,从响应的extensions中获取socket,再通过get_extra_info提取IP:
import httpx import asyncio async def fetch_server_ip(): url = "https://example.com" async with httpx.AsyncClient() as client: resp = await client.get(url) socket = resp.extensions.get("socket") if socket: server_ip, _ = socket.get_extra_info("peername") print(f"服务器IP:{server_ip}") asyncio.run(fetch_server_ip())
内容的提问来源于stack exchange,提问作者Dean MacGregor
相关产品推荐
相关产品推荐

