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''.