libreria - requests python
Python: cómo manejar una solicitud HTTPS con(Urllib2+SSL) a través de un proxy HTTP (3)
Yo personalmente sugeriría el uso de algo como python-requests
ya que aliviará muchos de los problemas con la configuración del proxy usando urllib2
directamente. Al usar requests
con un proxy, deberá hacer lo siguiente: (De su documentación )
import requests
proxies = {
''http'': ''http://10.10.1.10:3128'',
''https'': ''http://10.10.1.10:1080'',
}
requests.get(''http://example.org'', proxies=proxies)
Y deshabilitar la verificación del Certificado SSL es tan simple como pasar la verify=False
el comando requests.get
anterior. Sin embargo, esto se debe utilizar con moderación y el problema real con la verificación del certificado SSL debe resolverse.
Estoy tratando de probar una conexión proxy utilizando urllib2.ProxyHandler. Sin embargo, es probable que haya alguna situación en la que solicite un sitio web HTTPS (por ejemplo: https://www.whatismyip.com/ )
Urllib2.urlopen () lanzará ERROR si solicita un sitio HTTPS. Así que traté de usar una función auxiliar para reescribir el método URLOPEN.
Aquí está la función auxiliar:
def urlopen(url, timeout):
if hasattr(ssl, ''SSLContext''):
SslContext = ssl.create_default_context()
SslContext.check_hostname = False
SslContext.verify_mode = ssl.CERT_NONE
return urllib2.urlopen(url, timeout=timeout, context=SslContext)
else:
return urllib2.urlopen(url, timeout=timeout)
Esta función auxiliar basada en la respuesta
Luego uso:
urllib2.install_opener(
urllib2.build_opener(
urllib2.ProxyHandler({''http'': ''127.0.0.1:8080''})
)
)
para configurar el proxy http para urllib.opener
Idealmente, debería funcionar cuando solicite un sitio web utilizando urlopen(''http://whatismyip.com'', 30)
y debería pasar todo el tráfico a través del proxy HTTP.
Sin embargo, urlopen()
caerá en if hasattr(ssl, ''SSLContext'')
todo el tiempo, incluso si es un sitio HTTP. Además, el sitio HTTPS tampoco usa el proxy HTTP. Esto causa que el proxy HTTP se vuelva inválido y que todo el tráfico pase a través de la red no procesada
También probé esta respuesta para cambiar HTTP en HTTPS urllib2.ProxyHandler({''https'': ''127.0.0.1:8080''})
pero aún no funciona.
Mi proxy está funcionando. Si estoy usando urllib2.urlopen()
lugar de la versión de reescritura urlopen()
, funciona para el sitio HTTP.
Pero, sí tengo que considerar la instalación si el urlopen
va a necesitar ser utilizado en un sitio de HTTPS SOLAMENTE.
¿Como hacer eso?
Gracias
ACTUALIZACIÓN1: No puedo hacer que esto funcione con Python 2.7.11 y que algunos servidores funcionen correctamente con Python 2.7.5. Supongo que es un problema de versión de Python.
Urllib2 no pasará a través del proxy HTTPS, por lo que todas las direcciones web HTTPS no podrán usar el proxy.
El problema es cuando pasa el argumento de context
a urllib2.urlopen()
luego urllib2 crea el abridor en lugar de usar el global, que es el que se establece cuando se llama a urllib2.install_opener()
. Como resultado, su instancia de ProxyHandler
que pretendía utilizar no se está utilizando.
La solución no es instalar el abridor sino usar el abridor directamente. Al construir su abrelatas, debe pasar una instancia de su clase ProxyHandler
(para establecer los proxies para los protocolos http y https) y una instancia de la clase HTTPSHandler
( para establecer el contexto https ).
Creé https://bugs.python.org/issue29379 para este problema.
Una solución más es pasar el context
a HTTPSHandler
y pasar este manejador a build_opener
junto con ProxyHandler
:
proxies = {''https'': ''http://localhost:8080''}
proxy = urllib2.ProxyHandler(proxies)
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
handler = urllib2.HTTPSHandler(context=context)
opener = urllib2.build_opener(proxy, handler)
urllib2.install_opener(opener)
Ahora puede ver todas sus solicitudes / respuestas HTTPS en su proxy.