使用 Python 请求时如何获取底层套接字

How to get the underlying socket when using Python requests

我有一个 Python 脚本,它使用 requests 库创建许多短暂的同时连接。我特别需要找出每个连接使用的源端口,我想我需要为此访问底层套接字。有没有办法通过响应对象得到这个?

对于流式连接(使用 stream=True 参数打开的连接),您可以在响应对象上调用 .raw.fileno() 方法来获取打开的文件描述符。

您可以使用 socket.fromfd(...) 方法从描述符创建一个 Python 套接字对象:

>>> import requests
>>> import socket
>>> r = requests.get('http://google.com/', stream=True)
>>> s = socket.fromfd(r.raw.fileno(), socket.AF_INET, socket.SOCK_STREAM)
>>> s.getpeername()
('74.125.226.49', 80)
>>> s.getsockname()
('192.168.1.60', 41323)

对于非流式套接字,在返回响应对象之前清理文件描述符。据我所知,在这种情况下无法获得它。