2009-06-23 6 views
6

Est-ce que urllib2 dans Python 2.6.1 prend en charge le proxy via https?Est-ce que urllib2 dans Python 2.6.1 prend en charge le proxy via https

J'ai trouvé ce qui suit à http://www.voidspace.org.uk/python/articles/urllib2.shtml:

NOTE

Currently urllib2 does not support fetching of https locations through a proxy. This can be a problem.

Je suis en train d'automatiser la connexion dans le site Web et le téléchargement de documents, je nom d'utilisateur/mot de passe valide.

proxy_info = { 
    'host':"axxx", # commented out the real data 
    'port':"1234" # commented out the real data 
} 

proxy_handler = urllib2.ProxyHandler(
       {"http" : "http://%(host)s:%(port)s" % proxy_info}) 
opener = urllib2.build_opener(proxy_handler, 
     urllib2.HTTPHandler(debuglevel=1),urllib2.HTTPCookieProcessor()) 
urllib2.install_opener(opener) 

fullurl = 'https://correct.url.to.login.page.com/user=a&pswd=b' # example 
req1 = urllib2.Request(url=fullurl, headers=headers) 
response = urllib2.urlopen(req1) 

Je l'ai eu à travailler pour des pages similaires, mais pas en utilisant le protocole HTTPS et je soupçonne qu'il ne soit pas par procuration - il est de coincé dans la même manière que quand je n'ai pas précisé proxy. Je dois sortir par procuration.

Je dois m'authentifier mais ne pas utiliser l'authentification de base, urllib2 deviendra-t-il une authentification lors d'un passage sur le site https (je fournis le nom d'utilisateur/mot de passe au site via url)?

EDIT: Non, j'ai testé avec

proxies = { 
     "http" : "http://%(host)s:%(port)s" % proxy_info, 
     "https" : "https://%(host)s:%(port)s" % proxy_info 
    } 

    proxy_handler = urllib2.ProxyHandler(proxies) 

Et j'obtiens l'erreur:

urllib2.URLError: urlopen error [Errno 8] _ssl.c:480: EOF occurred in violation of protocol

Répondre

3

Je ne suis pas sûr de l'article de Michael Foord, que vous citez, est mis à jour à Python 2.6. 1 - pourquoi ne pas essayer? Au lieu de dire à ProxyHandler que le proxy n'est bon que pour http, comme vous le faites maintenant, enregistrez-le aussi pour https (bien sûr, vous devez le formater en une seule fois avant d'appeler ProxyHandler et simplement utiliser cette variable dans le dict): qui peut ou peut ne pas fonctionner, mais, vous n'êtes même pas essayer , et c'est que ne pas travailler -)

+0

Aaah, got it :) me laisser essayer (BTW je l'ai compris ce que je avais besoin avec boucle, mais serait toujours agréable d'avoir en cours d'exécution en python) – stefanB

+0

Malheureusement ajouter le proxy comme la clé « https » dans le dict que vous passez à ProxyHandler ne résoudra pas le problème car AFAIK il n'y a pas de support pour la méthode HTTP CONNECT. L'utilisation de PyCurl est la solution de contournement la plus simple, mais pour distribuer du code, le manque de support de Windows dans PyCurl (ou du moins la facilité d'installation) peut être un gros obstacle. – Tom

3

Incase quelqu'un d'autre a ce problème à l'avenir, je voudrais! faites remarquer qu'il supporte maintenant le proxy https, assurez-vous que le proxy le supporte aussi ou vous risquez de tomber dans un bug qui met la bibliothèque python dans une boucle infinie (ce qui m'est arrivé).

Voir unittest dans la source de python qui teste https mandatement support pour plus d'informations: http://svn.python.org/view/python/branches/release26-maint/Lib/test/test_urllib2.py?r1=74203&r2=74202&pathrev=74203

+0

+1 merci pour l'info – stefanB

+0

+ 1 pour le lien vers un unittest dans la source python – charmoniumQ

6

fixe en Python 2.6.3 et plusieurs autres branches:

  • _bugs. python.org/issue1424152 (remplacer _ par http ...)
  • http://www.python.org/download/releases/2.6.3/NEWS.txt

    Problème n ° 1424152: correction de httplib, urllib2 prenant en charge le protocole SSL tout en travaillant via le proxy . Patch original de Christopher Li, modifications apportées par Senthil Kumaran.

+0

+1 merci pour l'info – stefanB

Questions connexes