Requests: 绑定特定IP

创建于 2012-01-27  ·  15评论  ·  资料来源: psf/requests

能够将特定 IP 绑定为源地址(对于具有多个 IP 地址的主机)会很棒。

最有用的评论

import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

如果从两个源 ip 号出去的流量通过两个不同的公共 ip 号出去,则应该在响应的源字段中看到这些不同的公共号。

所有15条评论

有趣的。 您如何看待使用情况?

^ shazow/urllib3#9

目标是使用与特定国家/地区关联的 IP 编写爬虫。 但我不知道它将如何在 API 级别上使用。

难道您不能只向具有特定Host标头的 IP 发送请求吗?

不,因为它在网络服务器日志中有特定的 IP(使用 GeoIP 之类的工具反向到特定的国家)。

我不跟。

>>> requests.get('http://184.106.67.239', headers={'host': 'ci.kennethreitz.com'})
<Response [200]>
import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

如果从两个源 ip 号出去的流量通过两个不同的公共 ip 号出去,则应该在响应的源字段中看到这些不同的公共号。

我认为这超出了范围。

对于对此仍然感兴趣的人,您可能想看看 urlib3 的 HttpConnectionPool,特别是在新的 httplib/http.client HttpConnections 被启动的地方,以便您可以传入 source_address。 如果您这样做,那么您可以继续在请求的请求模型中公开它,并根据需要使用它。

对于那些从谷歌来到这里的人,你需要关注这个: https :

这应该重新打开 - 它没有超出范围,并且在使用 VPN 内的主机时非常必要。

根据当前和远程网络地址空间的具体情况,经常需要从绑定到 VPN 设置的接口的 IP 发送请求。 或者更改路由表。 这至少适用于在 Mac 上使用 NetExtender。

许多网络程序如 ssh 和 curl 支持将接口设置为使用/绑定到接口的 IP。

@petri鉴于 Requests 项目的范围完全由 Kenneth 定义,您关于这并未超出范围的断言是不正确的。 =)

具体来说,我们认为它超出了核心请求项目的范围。 不过,你还是可以做到的,而且难度也不大。 这个讨论涵盖了如何做到这一点。

很好 - 我不知道请求中有这种机制。 谢谢!

import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

如果从两个源 ip 号出去的流量通过两个不同的公共 ip 号出去,则应该在响应的源字段中看到这些不同的公共号。

只是想让你知道我一直在网上搜索,这是唯一对我有用的解决方案。

此页面是否有帮助?
0 / 5 - 0 等级