Wie spezifiziere ich einen authentifizierten Proxy für eine Python-HTTP-Verbindung?
Frage
Was ist der beste Weg, um einen Proxy mit Benutzername und Passwort für eine http-Verbindung in Python anzugeben?
Lösung
Benutze das:
import requests
proxies = {"http":"http://username:password@proxy_ip:proxy_port"}
r = requests.get("http://www.example.com/", proxies=proxies)
print(r.content)
Ich denke, es ist viel einfacher als die Verwendung urllib
.Ich verstehe nicht, warum die Leute es lieben, es zu benutzen urllib
so viel.
Andere Tipps
Das funktioniert bei mir:
import urllib2
proxy = urllib2.ProxyHandler({'http': 'http://
username:password@proxyurl:proxyport'})
auth = urllib2.HTTPBasicAuthHandler()
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler)
urllib2.install_opener(opener)
conn = urllib2.urlopen('http://python.org')
return_str = conn.read()
Festlegen einer Umgebungsvariablen mit dem Namen HTTP-Proxy so was: http://Benutzername:Passwort@Proxy-URL:Port
Der beste Weg, über einen Proxy zu gehen, der eine Authentifizierung erfordert, ist die Verwendung urllib2 um einen benutzerdefinierten URL-Öffner zu erstellen und diesen dann zu verwenden, um alle gewünschten Anfragen über den Proxy zu stellen.Beachten Sie insbesondere, dass Sie das Proxy-Passwort wahrscheinlich nicht in die URL oder den Python-Quellcode einbetten möchten (es sei denn, es handelt sich nur um einen schnellen Hack).
import urllib2
def get_proxy_opener(proxyurl, proxyuser, proxypass, proxyscheme="http"):
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, proxyurl, proxyuser, proxypass)
proxy_handler = urllib2.ProxyHandler({proxyscheme: proxyurl})
proxy_auth_handler = urllib2.ProxyBasicAuthHandler(password_mgr)
return urllib2.build_opener(proxy_handler, proxy_auth_handler)
if __name__ == "__main__":
import sys
if len(sys.argv) > 4:
url_opener = get_proxy_opener(*sys.argv[1:4])
for url in sys.argv[4:]:
print url_opener.open(url).headers
else:
print "Usage:", sys.argv[0], "proxy user pass fetchurls..."
In einem komplexeren Programm können Sie diese Komponenten nach Bedarf trennen (z. B. indem Sie während der gesamten Lebensdauer der Anwendung nur einen Passwort-Manager verwenden).Die Python-Dokumentation hat Weitere Beispiele, wie man komplexe Dinge mit urllib2 erledigt die auch für Sie nützlich sein könnten.
Oder wenn Sie es installieren möchten, damit es immer mit urllib2.urlopen verwendet wird (damit Sie keinen Verweis auf den Opener bereithalten müssen):
import urllib2
url = 'www.proxyurl.com'
username = 'user'
password = 'pass'
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
# None, with the "WithDefaultRealm" password manager means
# that the user/pass will be used for any realm (where
# there isn't a more specific match).
password_mgr.add_password(None, url, username, password)
auth_handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
print urllib2.urlopen("http://www.example.com/folder/page.html").read()
Hier ist die Methode, die urllib verwendet
import urllib.request
# set up authentication info
authinfo = urllib.request.HTTPBasicAuthHandler()
proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"})
# build a new opener that adds authentication and caching FTP handlers
opener = urllib.request.build_opener(proxy_support, authinfo,
urllib.request.CacheFTPHandler)
# install it
urllib.request.install_opener(opener)
f = urllib.request.urlopen('http://www.python.org/')
"""