请求,绑定ip

问题描述 投票:0回答:3

我有一个脚本可以用

urllib2
发出一些请求。

我使用 Stack Overflow 上其他地方建议的技巧将另一个 IP 绑定到应用程序,其中我的计算机有两个 IP 地址(IP A 和 IP B)。

我想改用

requests

。有谁知道我如何使用该库实现相同的功能?

python urllib2 python-requests
3个回答
22
投票
查看

requests

 模块,看起来它使用 
httplib
 来发送 http 请求。 
httplib
 使用 
socket.create_connection()
 连接到 www 主机。

了解这一点并按照您提供的链接中的猴子修补方法进行操作:

import socket real_create_conn = socket.create_connection def set_src_addr(*args): address, timeout = args[0], args[1] source_address = ('IP_ADDR_TO_BIND_TO', 0) return real_create_conn(address, timeout, source_address) socket.create_connection = set_src_addr import requests r = requests.get('http://www.google.com')
看起来 

httplib

 将所有参数(到 
create_connection()
)作为参数(与关键字)传递,因为尝试扩展 
kwargs
 内的 
set_src_addr
 字典失败了。  我相信上面是你想要的,但我没有双宿主机可以测试。


2
投票
实际上,您应该

将IP绑定到这样的请求:

import urllib3 real_create_conn = urllib3.util.connection.create_connection def set_src_addr(address, timeout, *args, **kw): source_address = ('YOUR_BIND_IP', 0) return real_create_conn(address, timeout=timeout, source_address=source_address) urllib3.util.connection.create_connection = set_src_addr import requests r = requests.get('http://ipecho.net/plain') print( r.text)
    

1
投票
重新发布我在重复问题中的答案,因为我相信这是一个更干净的解决方案:

您可以使用 requests-toolbelt 中的

SourceAddressAdapter

import requests from requests_toolbelt.adapters import source source = source.SourceAddressAdapter('127.0.0.1') with requests.Session() as session: session.mount('http://', source) r = session.get("http://example.com/foo/bar")
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.