Quelle est la meilleure façon de spécifier un proxy avec un nom d'utilisateur et le mot de passe pour une connexion http en python?
Réponses
Trop de publicités?Cela fonctionne pour moi:
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()
Le meilleur moyen de passer par un proxy qui requiert l'authentification à l'aide de urllib2 pour construire une url personnalisée ouvreur, puis l'utilise pour faire toutes les requêtes que vous souhaitez passer par le proxy. Remarque en particulier, vous ne voulez probablement pas à intégrer le proxy mot de passe dans l'url ou le code source python (sauf si c'est juste un petit 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..."
Dans un programme plus complexe, vous pouvez séparer ces composants comme approprié (par exemple, seulement en utilisant un gestionnaire de mot de passe pour la durée de vie de l'application). La documentation python a plus d'exemples sur la façon de faire des choses complexes avec urllib2 que vous pouvez également trouver utile.
Ou si vous voulez l'installer, de sorte qu'il est toujours utilisé avec urllib2.urlopen (si vous n'avez pas besoin de conserver une référence à l'ouvreur autour):
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")