soup requests beautiful python ssl https httplib pyopenssl

requests - Conexión HTTPS Python



python requests github (8)

Estoy intentando verificar que ese objetivo expone un servicio web https. Tengo un código para conectarme a través de HTTP pero no estoy seguro de cómo conectarme a través de HTTPS. Leí que usa SSL, pero también he leído que no admite errores de certificado. El código que obtuve proviene de los documentos de Python:

import httplib conn = httplib.HTTPConnection("www.python.org") conn.request("GET", "/index.html") r1 = conn.getresponse() print r1.status, r1.reason

¿Alguien sabe cómo conectarse a HTTPS?

Ya probé la HTTPSConenction pero responde con un código de error que afirma que httplib no tiene el atributo HTTPSConnection. Tampoco tengo socket.ssl ​​disponible.

He instalado Python 2.6.4 y no creo que tenga soporte SSL compilado en él. ¿Hay alguna manera de integrar este suppot en el python más nuevo sin tener que instalarlo de nuevo?

He instalado OpenSSL y pyOpenSsl y he intentado el siguiente código a partir de una de las respuestas:

import urllib2 from OpenSSL import SSL try: response = urllib2.urlopen(''https://example.com'') print ''response headers: "%s"'' % response.info() except IOError, e: if hasattr(e, ''code''): # HTTPError print ''http error code: '', e.code elif hasattr(e, ''reason''): # URLError print "can''t connect, reason: ", e.reason else: raise

Tengo un error:

Traceback (most recent call last): File "<stdin>", line 2, in <module> File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 87, in urlopen return opener.open(url) File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 203, in open return self.open_unknown(fullurl, data) File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 215, in open_unknown raise IOError, (''url error'', ''unknown url type'', type) IOError: [Errno url error] unknown url type: ''https''

¿Alguien sabe cómo hacerlo funcionar?

-- UPDATE

Descubrí cuál era el problema, la versión de Python que estaba usando no tenía soporte para SSL. Encontré esta solución actualmente en: http://www.webtop.com.au/compiling-python-with-ssl-support .

El código ahora funcionará después de esta solución que es muy buena. Cuando importo ssl y HTTPSConnection, sé que no aparece un error.

Gracias por toda la ayuda.


¿Por qué no has probado httplib.HTTPSConnection? No hace la validación SSL, pero esto no es necesario para conectarse a través de https. Tu código funciona bien con la conexión https:

>>> import httplib >>> conn = httplib.HTTPSConnection("mail.google.com") >>> conn.request("GET", "/") >>> r1 = conn.getresponse() >>> print r1.status, r1.reason 200 OK


Para comprobar el soporte de SSL en Python 2.6+ :

try: import ssl except ImportError: print "error: no ssl support"

Para conectarse a través de https :

import urllib2 try: response = urllib2.urlopen(''https://example.com'') print ''response headers: "%s"'' % response.info() except IOError, e: if hasattr(e, ''code''): # HTTPError print ''http error code: '', e.code elif hasattr(e, ''reason''): # URLError print "can''t connect, reason: ", e.reason else: raise


Python 2.x: docs.python.org/2/library/httplib.html :

Nota: El soporte HTTPS solo está disponible si el módulo de socket fue compilado con soporte SSL.

Python 3.x: docs.python.org/3/library/http.client.html :

Nota El soporte HTTPS solo está disponible si Python se compiló con soporte SSL (a través del módulo ssl).

#!/usr/bin/env python import httplib c = httplib.HTTPSConnection("ccc.de") c.request("GET", "/") response = c.getresponse() print response.status, response.reason data = response.read() print data # => # 200 OK # <!DOCTYPE html ....

Para verificar si SSL está habilitado, intente:

>>> import socket >>> socket.ssl <function ssl at 0x4038b0>


Si usa httplib.HTTPSConnection:

Por favor, eche un vistazo a: Modificado en la versión 2.7.9:

Esta clase ahora realiza todos los certificados necesarios y las verificaciones del nombre de host de forma predeterminada. Para volver al comportamiento anterior, no verificado, ssl._create_unverified_context () se puede pasar al parámetro de contexto. Puedes usar:

if hasattr(ssl, ''_create_unverified_context''): ssl._create_default_https_context = ssl._create_unverified_context


Suponiendo que la compatibilidad con SSL está habilitada para el módulo de socket .

connection1 = httplib.HTTPSConnection(''www.somesecuresite.com'')


Tenía un código que estaba fallando con un HTTPConnection (MOVED_PERMANENTLY error) , pero tan pronto como HTTPConnection (MOVED_PERMANENTLY error) a HTTPS funcionó perfectamente otra vez sin necesidad de otros cambios. ¡Es una solución muy simple!



import requests r = requests.get("https://.com") data = r.content # Content of response print r.status_code # Status code of response print data