栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用请求库从http请求中获取IP地址?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用请求库从http请求中获取IP地址?

事实证明,它涉及其中。

这是使用

requests
1.2.3版时的一个猴子补丁:

包装

_make_request
方法
HTTPConnectionPool
以存储实例
socket.getpeername()
上的响应
HTTPResponse

对我而言,在python 2.7.3上,该实例在上可用

response.raw._original_response

from requests.packages.urllib3.connectionpool import HTTPConnectionPooldef _make_request(self,conn,method,url,**kwargs):    response = self._old_make_request(conn,method,url,**kwargs)    sock = getattr(conn,'sock',False)    if sock:        setattr(response,'peer',sock.getpeername())    else:        setattr(response,'peer',None)    return responseHTTPConnectionPool._old_make_request = HTTPConnectionPool._make_requestHTTPConnectionPool._make_request = _make_requestimport requestsr = requests.get('http://www.google.com')print r.raw._original_response.peer

产量:

('2a00:1450:4009:809::1017', 80, 0, 0)

嗯,如果涉及代理或响应被分块,

HTTPConnectionPool._make_request
则不会调用该代理。

因此,这里有一个新版本的补丁程序

httplib.getresponse

import httplibdef getresponse(self,*args,**kwargs):    response = self._old_getresponse(*args,**kwargs)    if self.sock:        response.peer = self.sock.getpeername()    else:        response.peer = None    return responsehttplib.HTTPConnection._old_getresponse = httplib.HTTPConnection.getresponsehttplib.HTTPConnection.getresponse = getresponseimport requestsdef check_peer(resp):    orig_resp = resp.raw._original_response    if hasattr(orig_resp,'peer'):        return getattr(orig_resp,'peer')

运行:

>>> r1 = requests.get('http://www.google.com')>>> check_peer(r1)('2a00:1450:4009:808::101f', 80, 0, 0)>>> r2 = requests.get('https://www.google.com')>>> check_peer(r2)('2a00:1450:4009:808::101f', 443, 0, 0)>>> r3 = requests.get('http://wheezyweb.readthedocs.org/en/latest/tutorial.html#what-you-ll-build')>>> check_peer(r3)('162.209.99.68', 80)

还检查了是否设置了代理运行;返回代理地址。


更新 2016/01/19

est提供了不需要monkey-patch的替代方法:

rsp = requests.get('http://google.com', stream=True)# grab the IP while you can, before you consume the body!!!!!!!!print rsp.raw._fp.fp._sock.getpeername()# consume the body, which calls the read(), after that fileno is no longer available.print rsp.content

更新 2016/05/19

从评论中复制到此处以提高可见性,Richard KennethNiescior提供了以下已确认可用于请求2.10.0和Python 3的内容。

rsp=requests.get(..., stream=True)rsp.raw._connection.sock.getpeername()

更新 2019/02/22

要求版本为2.19.1的Python3。

resp=requests.get(..., stream=True)resp.raw._connection.sock.socket.getsockname()

更新 2020/01/31

带有请求2.22.0的Python3.8

resp = requests.get('https://www.google.com', stream=True)resp.raw._connection.sock.getsockname()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381014.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号