Ce serait formidable de pouvoir lier une IP particulière comme adresse source (pour les hôtes avec plusieurs adresses IP).
Intéressant. Comment envisagez-vous l'utilisation ?
^ shazow/urllib3#9
Le but est d'écrire un crawler en utilisant une IP associée à un pays particulier. Mais je ne sais pas comment il serait utilisé au niveau de l'API.
Ne pourriez-vous pas simplement envoyer une requête à une adresse IP avec un en-tête Host
?
Non, car il s'agit d'avoir l'IP spécifique dans le journal du serveur Web (à inverser vers un pays particulier à l'aide d'outils comme GeoIP).
Je ne suis pas.
>>> 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()
Si le trafic sortant des deux numéros d'adresse IP source passe par deux numéros d'adresse IP publics différents, vous devriez voir ces numéros publics différents dans le champ d'origine de la réponse.
Je pense que c'est hors de portée.
Pour les personnes intéressées par cela, vous voudrez peut-être jeter un œil à HttpConnectionPool d'urlib3, en particulier où les nouvelles httplib/http.client HttpConnections sont lancées afin que vous puissiez passer source_address. Si vous faites cela, vous pouvez continuer à l'exposer dans le modèle de demande de la demande et l'utiliser comme vous le souhaitez.
Pour ceux qui arrivent ici de google, vous voudrez suivre ceci : https://github.com/shazow/urllib3/issues/9#issuecomment -15871420
Cela devrait être rouvert - ce n'est pas hors de portée, et c'est tout à fait nécessaire lorsque vous travaillez avec des hôtes à l'intérieur d'un VPN.
En fonction des spécificités des espaces d'adressage du réseau actuel et distant, il faut souvent envoyer des requêtes depuis l'IP lié à l'interface configurée par le VPN. Ou apportez des modifications à la table de routage. Cela s'applique au moins à l'utilisation de NetExtender sur un Mac.
De nombreux programmes de mise en réseau tels que ssh et curl prennent en charge la définition de l'interface à utiliser / la liaison à l'IP d'une interface.
@petri Votre affirmation selon laquelle ce n'est pas hors de portée est incorrecte, étant donné que la portée du projet Requests est entièrement définie par Kenneth. =)
Plus précisément, nous le considérons comme étant hors de portée du projet de requêtes principales. Cependant, vous pouvez toujours le faire, et ce n'est même pas très difficile. Cette discussion explique comment le faire.
Nice - Je n'étais pas au courant de ce genre de mécanisme dans les demandes. Merci!
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()
Si le trafic sortant des deux numéros d'adresse IP source passe par deux numéros d'adresse IP publics différents, vous devriez voir ces numéros publics différents dans le champ d'origine de la réponse.
Je voulais juste que vous sachiez que j'ai parcouru Internet pendant une éternité et que c'était la seule solution qui a fonctionné pour moi.
https://toolbelt.readthedocs.io/en/latest/adapters.html#sourceaddressadapter existe et est beaucoup moins un hack
Commentaire le plus utile
Si le trafic sortant des deux numéros d'adresse IP source passe par deux numéros d'adresse IP publics différents, vous devriez voir ces numéros publics différents dans le champ d'origine de la réponse.