2010-05-28 19 views
9

Este trabajo fino:Python urllib2> Proxy HTTP> HTTPS petición

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() 

Pero, si http cambio a https:

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

hay errores:

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] 

¿Por qué y cómo resolver este problema?

+3

si usted está leyendo esto: por favor marque la respuesta correcta como correcta. Esto es para asegurar que nadie pierda su tiempo tratando de responder una pregunta ya respondida. También es una forma agradable de expresar su agradecimiento a la persona que ideó una solución para su problema – Sheena

Respuesta

1

En Windows, errno 10060 es un error de winsock que significa que se ha agotado el tiempo de espera de la conexión. ¿Puede comunicarse al https://www.google.com desde la misma máquina usando un navegador web con un proxy establecido en http://user:[email protected]:3128? ¿Estás seguro de que tu servidor proxy puede manejar tanto https como http en el mismo puerto?

16

cambiar esta línea:

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

a esto:

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

Funciona bien para mí.

+0

Sí, esta es la solución correcta – fijiaaron

+0

urllib2.ProxyHandler ({'https': 'https: // usuario: pass @ proxy: 3128 '})) Cambie el segundo http por https si desea usar http y un proxy http en su urllib2 – k9b

1

El documentation para urllib2 dice lo siguiente:

Nota: En la actualidad no es compatible con urllib2 ir a buscar lugares de https través de un proxy. Sin embargo, esto puede habilitarse extendiendo urllib2 como que se muestra en this recipe.

Debo admitir que la receta anterior no funcionó de inmediato para Jython 2.5.3, pero sigo intentándolo.

ACTUALIZACIÓN: Apliqué this patch a Jython 2.5.3, y funcionó para mí. Puedo buscar recursos HTTPS en un servidor proxy ahora.

Update2: Este es el código para consultar recursos HTTPS con autenticación básica sobre el proxy HTTP (NO se olvide de instalar parche antes (véase la actualización anterior)):

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()