我有一个脚本可以用
urllib2
发出一些请求。
我使用 Stack Overflow 上其他地方建议的技巧将另一个 IP 绑定到应用程序,其中我的计算机有两个 IP 地址(IP A 和 IP B)。
我想改用库。有谁知道我如何使用该库实现相同的功能?
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
字典失败了。 我相信上面是你想要的,但我没有双宿主机可以测试。
将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)
您可以使用 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")