2010-05-28 5 views
9

Ce beau travail:Python urllib2> Proxy HTTP> HTTPS demande

import urllib2 

opener = urllib2.build_opener(
       urllib2.HTTPHandler(), 
       urllib2.HTTPSHandler(), 
       urllib2.ProxyHandler({'http': 'http://user:[email protected]:3128'})) 
urllib2.install_opener(opener) 
print urllib2.urlopen('http://www.google.com').read() 

Mais, si http changement https:

... 
print urllib2.urlopen('https://www.google.com').read() 

Il y a des erreurs:

Traceback (most recent call last): 
    File "D:\Temp\6\tmp.py", line 13, in <module> 
    print urllib2.urlopen('https://www.google.com').read() 
    File "C:\Python26\lib\urllib2.py", line 124, in urlopen 
    return _opener.open(url, data, timeout) 
    File "C:\Python26\lib\urllib2.py", line 389, in open 
    response = self._open(req, data) 
    File "C:\Python26\lib\urllib2.py", line 407, in _open 
    '_open', req) 
    File "C:\Python26\lib\urllib2.py", line 367, in _call_chain 
    result = func(*args) 
    File "C:\Python26\lib\urllib2.py", line 1154, in https_open 
    return self.do_open(httplib.HTTPSConnection, req) 
    File "C:\Python26\lib\urllib2.py", line 1121, in do_open 
    raise URLError(err) 
URLError: <urlopen error [Errno 10060] 

Pourquoi et comment résoudre ce problème?

+3

si vous lisez ceci: veuillez marquer la bonne réponse comme correcte. Ceci afin de s'assurer que personne ne perd son temps à essayer de répondre à une question déjà posée. C'est aussi une bonne façon de dire merci à la personne qui a trouvé une solution à votre problème. – Sheena

Répondre

1

Sous Windows, errno 10060 est une erreur winsock qui signifie que la connexion a expiré. Êtes-vous en mesure d'atteindre https://www.google.com à partir de la même machine à l'aide d'un navigateur Web avec un proxy défini sur http://user:[email protected]:3128? Êtes-vous sûr que votre serveur proxy peut gérer à la fois https et http sur le même port?

16

Modifier cette ligne:

urllib2.ProxyHandler({'http': 'http://user:[email protected]:3128'})) 

à ceci:

urllib2.ProxyHandler({'https': 'http://user:[email protected]:3128'})) 

Il fonctionne très bien pour moi.

+0

Oui, c'est la bonne solution – fijiaaron

+0

urllib2.ProxyHandler ({'https': 'https: // user: pass @ proxy: 3128 '})) Modifier le deuxième http en https si vous souhaitez utiliser à la fois http et un proxy http dans votre urllib2 – k9b

1

Le documentation pour urllib2 dit le texte suivant:

Note: Actuellement urllib2 ne supporte pas la lecture d'emplacements https via un proxy. Cependant, cela peut être activé en étendant urllib2 comme montré dans this recipe.

Je dois admettre que la recette ci-dessus n'a pas fonctionné tout de suite pour Jython 2.5.3, mais j'essaie toujours.

MISE À JOUR: J'ai appliqué this patch à Jython 2.5.3, et cela a fonctionné pour moi. Je peux maintenant récupérer des ressources HTTPS sur un serveur proxy.

MAJ2: Voici le code pour interroger les ressources HTTPS avec authentification de base sur HTTP (NE PAS OUBLIER INSTALLER PATCH FIRST (voir mise à jour précédente)):

from suds.client import Client 
from suds.transport.https import HttpAuthenticated 

credentials = dict(username='...', password='...', proxy={'https': 'host:port', 'http': 'host:port'}) 
t = HttpAuthenticated(**credentials) 
url = 'https://example.com/service?wsdl' 
client = Client(url, transport=t) 
print client.service.getFoo()