Es wäre großartig, eine bestimmte IP als Quelladresse binden zu können (für Hosts mit mehreren IP-Adressen).
Interessant. Wie stellen Sie sich die Nutzung vor?
^ shazow/urllib3#9
Das Ziel besteht darin, einen Crawler zu schreiben, der eine IP verwendet, die einem bestimmten Land zugeordnet ist. Aber ich weiß nicht, wie es auf API-Ebene verwendet werden würde.
Könnten Sie nicht einfach eine Anfrage an eine IP mit einem bestimmten Host
Header senden?
Nein, denn es muss die spezifische IP im Webserver-Log enthalten sein (um mit Tools wie GeoIP auf ein bestimmtes Land zurückgesetzt zu werden).
Ich folge nicht.
>>> 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()
Wenn der von den beiden Quell-IP-Nummern ausgehende Verkehr über zwei verschiedene öffentliche IP-Nummern ausgeht, sollten diese verschiedenen öffentlichen Nummern im Ursprungsfeld der Antwort angezeigt werden.
Ich denke, das ist außerhalb des Rahmens.
Für Leute, die immer noch daran interessiert sind, möchten Sie vielleicht einen Blick auf den HttpConnectionPool von urlib3 werfen, insbesondere dort, wo neue httplib/http.client HttpConnections erstellt werden, damit Sie source_address übergeben können. Wenn Sie dies tun, können Sie dies weiterhin im Anfragemodell der Anfrage anzeigen und nach Belieben verwenden.
Für diejenigen, die von Google hierher kommen, sollten Sie diesem folgen: https://github.com/shazow/urllib3/issues/9#issuecomment -15871420
Dies sollte erneut geöffnet werden - es ist nicht außerhalb des Umfangs und es ist durchaus notwendig, wenn Sie mit Hosts innerhalb eines VPN arbeiten.
Abhängig von den Besonderheiten der Adressräume des aktuellen & entfernten Netzwerks muss man oft Anfragen von der IP an die vom VPN eingerichtete Schnittstelle senden. Oder nehmen Sie Änderungen an der Routing-Tabelle vor. Dies gilt zumindest für die Verwendung von NetExtender auf einem Mac.
Viele Netzwerkprogramme wie ssh und curl unterstützen die Einstellung der Schnittstelle zur Verwendung / Bindung an die IP einer Schnittstelle.
@petri Ihre Behauptung, dass dies nicht außerhalb des Umfangs liegt, ist falsch, da der Umfang des Requests-Projekts vollständig von Kenneth definiert wird. =)
Konkret sehen wir es als außerhalb des Rahmens für das Kernanfragen-Projekt an. Sie können es jedoch immer noch tun, und es ist nicht einmal sehr schwer. In dieser Diskussion wird beschrieben, wie es geht.
Schön - mir war dieser Mechanismus bei Anfragen nicht bekannt. Vielen Dank!
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()
Wenn der von den beiden Quell-IP-Nummern ausgehende Verkehr über zwei verschiedene öffentliche IP-Nummern ausgeht, sollten diese verschiedenen öffentlichen Nummern im Ursprungsfeld der Antwort angezeigt werden.
Ich wollte Sie nur wissen lassen, dass ich schon ewig das Internet durchforste und dies die einzige Lösung war, die für mich funktionierte.
https://toolbelt.readthedocs.io/en/latest/adapters.html#sourceaddressadapter existiert und ist weit weniger ein Hack
Hilfreichster Kommentar
Wenn der von den beiden Quell-IP-Nummern ausgehende Verkehr über zwei verschiedene öffentliche IP-Nummern ausgeht, sollten diese verschiedenen öffentlichen Nummern im Ursprungsfeld der Antwort angezeigt werden.