sitemapspider example crawl python ssl scrapy

python - example - scrapy sitemapspider



Deshabilitar la verificación del certificado SSL en Scrapy (1)

Actualmente estoy luchando con un problema que estoy teniendo con Scrapy. Cada vez que utilizaba Scrapy para raspar un sitio HTTPS donde el valor CN del certificado coincide con el nombre del dominio del servidor, ¡Scrapy funciona muy bien! Por otro lado, sin embargo, cada vez que intento rozar un sitio donde el valor CN del certificado NO coincide con el nombre de dominio del servidor, obtengo lo siguiente:

Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/twisted/protocols/tls.py", line 415, in dataReceived self._write(bytes) File "/usr/local/lib/python2.7/dist-packages/twisted/protocols/tls.py", line 554, in _write sent = self._tlsConnection.send(toSend) File "/usr/local/lib/python2.7/dist-packages/OpenSSL/SSL.py", line 1270, in send result = _lib.SSL_write(self._ssl, buf, len(buf)) File "/usr/local/lib/python2.7/dist-packages/OpenSSL/SSL.py", line 926, in wrapper callback(Connection._reverse_mapping[ssl], where, return_code) --- <exception caught here> --- File "/usr/local/lib/python2.7/dist-packages/twisted/internet/_sslverify.py", line 1055, in infoCallback return wrapped(connection, where, ret) File "/usr/local/lib/python2.7/dist-packages/twisted/internet/_sslverify.py", line 1154, in _identityVerifyingInfoCallback verifyHostname(connection, self._hostnameASCII) File "/usr/local/lib/python2.7/dist-packages/service_identity/pyopenssl.py", line 30, in verify_hostname obligatory_ids=[DNS_ID(hostname)], File "/usr/local/lib/python2.7/dist-packages/service_identity/_common.py", line 235, in __init__ raise ValueError("Invalid DNS-ID.") exceptions.ValueError: Invalid DNS-ID.

Revisé toda la documentación que pude y, por lo que puedo decir, Scrapy no tiene forma de deshabilitar la verificación de certificados SSL. Incluso la documentación para el objeto Solicitud de Scrapy (que supondría es dónde se encontraría esta funcionalidad) no tiene ninguna referencia:

http://doc.scrapy.org/en/1.0/topics/request-response.html#scrapy.http.Request https://github.com/scrapy/scrapy/blob/master/scrapy/http/request/ init .py

Tampoco hay configuraciones de Scrapy que aborden el problema:

http://doc.scrapy.org/en/1.0/topics/settings.html

A menos que use Scrapy por fuente y modifique la fuente según sea necesario, ¿alguien tiene alguna idea sobre cómo puedo desactivar la verificación del certificado SSL?

¡Gracias!


De la documentación que vinculó para la configuración , parece que podría modificar la configuración DOWNLOAD_HANDLERS .

De los documentos:

""" A dict containing the request download handlers enabled by default in Scrapy. You should never modify this setting in your project, modify DOWNLOAD_HANDLERS instead. """ DOWNLOAD_HANDLERS_BASE = { ''file'': ''scrapy.core.downloader.handlers.file.FileDownloadHandler'', ''http'': ''scrapy.core.downloader.handlers.http.HttpDownloadHandler'', ''https'': ''scrapy.core.downloader.handlers.http.HttpDownloadHandler'', ''s3'': ''scrapy.core.downloader.handlers.s3.S3DownloadHandler'', }

Luego, en tu configuración, algo como esto:

""" Configure your download handlers with something custom to override the default https handler """ DOWNLOAD_HANDLERS = { ''https'': ''my.custom.downloader.handler.https.HttpsDownloaderIgnoreCNError'', }

Por lo tanto, al definir un controlador personalizado para el protocolo https , usted debería poder manejar el error que está recibiendo y permitir que scrapy continúe con su ''negocio''.