2015-05-12 10 views
9

Durante il processo di raschiamento utilizzando scrapy, nei miei registri viene visualizzato di tanto in tanto un errore. Non sembra che si trovi da nessuna parte nel mio codice, e sembra qualcosa dentro twisted \ opensl. Qualche idea su cosa ha causato questo e come liberarsene?L'oggetto 'NoneType' non ha attributo '_app_data' in scrapy twisted openssl

Stacktrace qui:

[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) 
    --- <exception caught here> --- 
     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' 
+0

Non mettere parte della tua domanda su un altro sito. Metti la traccia dello stack nella tua domanda in linea. –

+0

Un esempio minimo che riproduce il problema sarebbe utile pure: http://sscce.org/ –

+0

ok, ho aggiornato la domanda con stacktrace inline.but non ho esempi riproducibili perché succede di tanto in tanto. forse come poche volte per 100k pagine scansionate, o forse anche meno. Non è qualcosa che può essere riprodotto facilmente, e tutto lo stacktrace senza il codice delle librerie, non il mio codice, quindi non ho idea di come fare un esempio minimo. – Aldarund

risposta

5

A prima vista, sembra come se questo è dovuto ad un bug in Scrapy. Scrapy definisce la propria "fabbrica di contesti" Twisted: https://github.com/scrapy/scrapy/blob/ad36de4e6278cf635509a1ade30cca9a506da682/scrapy/core/downloader/contextfactory.py#L21-L28

Questo codice crea ClientTLSOptions con il contesto che intende restituire. Un effetto collaterale dell'istanziazione di questa classe è che un "richiamo di informazioni" è installato nel contesto di fabbrica. Il callback delle informazioni richiede che l'implementazione Twisted TLS sia stata impostata come "dati dell'app" sulla connessione. Tuttavia, poiché nulla utilizza mai l'istanza ClientTLSOptions (viene scartata immediatamente), i dati dell'app non vengono mai impostati.

Quando il richiamo delle informazioni ritorna in giro per ottenere l'implementazione Twisted TLS (necessaria per fare parte del suo lavoro), invece, rileva che non ci sono dati di app e fallisce con l'eccezione che hai segnalato.

L'effetto collaterale di ClientTLSOptions è un po 'spiacevole ma penso che questo sia chiaramente un errore di scrapy causato da uso improprio/abuso di ClientTLSOptions. Non penso che questo codice possa mai essere stato testato molto bene poiché questo errore si verificherà ogni volta che un certificato non riesce a verificare.

Suggerisco di segnalare l'errore a Scrapy. Speriamo che possano risolvere il loro uso di ClientTLSOptions ed eliminare questo errore.

21

sono stato in grado di risolvere questo problema installando il pacchetto service_identity:

pip install service_identity

+5

Risolto il problema. Grazie. – thedp

+1

Cos'è questa stregoneria! Lo stesso bug, risolto subito. Grazie –

+0

non cambia nulla per me – Aldarund

0

sono stato in grado di risolvere il problema sostituendo https: // http: // in tutti i link delle immagini prima di inviare li alla imagepipeline

Problemi correlati