Было бы здорово иметь возможность привязать конкретный IP-адрес в качестве исходного адреса (для хостов с несколькими IP-адресами).
Интересно. Как вы оцениваете использование?
^ shazow / urllib3 # 9
Цель состоит в том, чтобы написать поискового робота, используя IP-адрес, связанный с определенной страной. Но я не знаю, как это будет использоваться на уровне API.
Не могли бы вы просто отправить запрос на IP с определенным заголовком Host
?
Нет, потому что в журнале веб-сервера должен быть указан конкретный 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-адреса, эти разные общедоступные номера должны быть видны в поле происхождения ответа.
Я думаю, это выходит за рамки.
Для людей, заинтересованных в этом, вы можете взглянуть на HttpConnectionPool urlib3, в частности, где создаются новые httplib / http.client HttpConnections, чтобы вы могли передать source_address. Если вы это сделаете, вы можете продолжать раскрывать это в модели запроса и использовать ее по своему усмотрению.
Для тех, кто прибывает сюда из Google, вы захотите следовать этому: https://github.com/shazow/urllib3/issues/9#issuecomment -15871420
Его следует снова открыть - это не выходит за рамки и совершенно необходимо при работе с хостами внутри VPN.
В зависимости от специфики адресных пространств текущей и удаленной сети часто приходится отправлять запросы с IP-адреса, привязанного к интерфейсу, установленному VPN. Или внесите изменения в таблицу маршрутизации. Это относится, по крайней мере, к использованию NetExtender на Mac.
Многие сетевые программы, такие как ssh и curl, поддерживают настройку интерфейса на использование / привязку к IP-адресу интерфейса.
@petri Ваше утверждение, что это не выходит за рамки, неверно, учитывая, что объем проекта Requests полностью определяется Кеннетом. знак равно
В частности, мы считаем, что это выходит за рамки основного проекта запросов. Тем не менее, вы все равно можете это сделать, и это даже не очень сложно. В этом обсуждении рассказывается, как это сделать.
Приятно - я не знал о таком механизме в запросах. Спасибо!
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-адреса, эти разные общедоступные номера должны быть видны в поле происхождения ответа.
Просто хотел, чтобы вы знали, я всю жизнь рыскал по Интернету, и это было единственное решение, которое сработало для меня.
https://toolbelt.readthedocs.io/en/latest/adapters.html#sourceaddressadapter существует, и это гораздо меньше взлома
Самый полезный комментарий
Если трафик, исходящий от двух исходных IP-адресов, проходит через два разных общедоступных IP-адреса, эти разные общедоступные номера должны быть видны в поле происхождения ответа.