El objeto ‘NoneType’ no tiene ningún atributo ‘_app_data’ en scrapy \ twisted \ openssl

Durante el proceso de raspado con scrapy aparece un error en mis registros de vez en cuando. No parece estar en ninguna parte de mi código, y parece algo dentro de twisted \ openssl. ¿Alguna idea de qué causó esto y cómo deshacerse de él?

Stacktrace aquí:

[Launcher,27487/stderr] Error during info_callback Traceback (most recent call last): File "/opt/webapps/link_crawler/lib/python2.7/site-packages/twisted/protocols/tls.py", line 415, in dataReceived self._write(bytes) File "/opt/webapps/link_crawler/lib/python2.7/site-packages/twisted/protocols/tls.py", line 554, in _write sent = self._tlsConnection.send(toSend) File "/opt/webapps/link_crawler/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1270, in send result = _lib.SSL_write(self._ssl, buf, len(buf)) File "/opt/webapps/link_crawler/lib/python2.7/site-packages/OpenSSL/SSL.py", line 926, in wrapper callback(Connection._reverse_mapping[ssl], where, return_code) ---  --- File "/opt/webapps/link_crawler/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 1055, in infoCallback return wrapped(connection, where, ret) File "/opt/webapps/link_crawler/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 1157, in _identityVerifyingInfoCallback transport = connection.get_app_data() File "/opt/webapps/link_crawler/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1589, in get_app_data return self._app_data File "/opt/webapps/link_crawler/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1148, in __getattr__ return getattr(self._socket, name) exceptions.AttributeError: 'NoneType' object has no attribute '_app_data' 

A primera vista, parece que esto se debe a un error en scrapy. Scrapy define su propia “fábrica de contextos” Retorcida: https://github.com/scrapy/scrapy/blob/ad36de4e6278cf635509a1ade30cca9a506da682/scrapy/core/downloader/contextfactory.py#L21-L28

Este código ClientTLSOptions instancia de ClientTLSOptions con el contexto que pretende devolver. Un efecto secundario de crear una instancia de esta clase es que se instala una “callback de información” en la fábrica de contexto. La información de callback requiere que la implementación de Twisted TLS se haya configurado como “datos de la aplicación” en la conexión. Sin embargo, dado que nada utiliza la instancia ClientTLSOptions (se descarta de inmediato), los datos de la aplicación nunca se configuran.

Cuando la información de callback regresa para obtener la implementación de Twisted TLS (necesaria para hacer parte de su trabajo), en su lugar, descubre que no hay datos de la aplicación y falla con la excepción que reportó.

El efecto ClientTLSOptions de ClientTLSOptions es un poco desagradable, pero creo que esto es claramente un error de rechazo causado por el mal uso o abuso de ClientTLSOptions . No creo que este código haya podido probarse muy bien ya que este error ocurrirá cada vez que un certificado no se pueda verificar.

Sugiero informar el error a Scrapy. Esperamos que puedan corregir su uso de ClientTLSOptions y eliminar este error por usted.

Pude resolver este problema instalando el paquete service_identity :

pip install service_identity

Pude resolver el problema reemplazando https: // con http: // en todos los enlaces de imagen antes de enviarlos a la línea de imagen