2015-05-12 7 views
9

Während des Scraping-Prozesses mit scrapy erscheint ein Fehler von Zeit zu Zeit in meinen Logs. Es scheint nirgendwo in meinem Code und sieht aus wie etwas in twisted \ openssl. Irgendwelche Ideen, was das verursacht und wie man es los wird?'NoneType' Objekt hat kein Attribut '_app_data' in scrapy twisted openssl

Stacktrace hier:

[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

Veröffentlichen Sie keinen Teil Ihrer Frage auf einer anderen Website. Fügen Sie den Stack-Trace inline in Ihre Frage ein. –

+0

Ein minimales Beispiel, das das Problem reproduziert, wäre auch nützlich: http://sscce.org/ –

+0

ok, ich aktualisierte die Frage mit StackTrace inline.aber ich habe kein reproduzierbares Beispiel, weil es von Zeit zu Zeit passiert. vielleicht ein paar Mal für 100k Seiten, oder vielleicht noch weniger. Es ist nicht etwas, das einfach reproduziert werden kann, und alle Stack-Traces innerhalb des Codes von Bibliotheken, nicht von Minen-Code, haben also keine Ahnung, wie man ein minimales Beispiel macht. – Aldarund

Antwort

5

Auf den ersten Blick scheint es, als ob dies auf einen Fehler in scrapy zurückzuführen ist. Scrapy legt seine eigene Twisted „Kontext Fabrik“: https://github.com/scrapy/scrapy/blob/ad36de4e6278cf635509a1ade30cca9a506da682/scrapy/core/downloader/contextfactory.py#L21-L28

Dieser Code instanziiert ClientTLSOptions mit dem Kontext sie zurückkehren will. Ein Nebeneffekt der Instanziierung dieser Klasse ist, dass ein "Info-Callback" in der Kontext-Factory installiert ist. Der Info-Callback erfordert, dass die Twisted TLS-Implementierung als "App-Daten" für die Verbindung festgelegt wurde. Da jedoch nie die Instanz ClientTLSOptions verwendet wird (sie wird sofort verworfen), werden die App-Daten nie festgelegt.

Wenn der Info-Callback zurückkehrt, um die Twisted-TLS-Implementierung zu erhalten (notwendig, um einen Teil seiner Arbeit zu erledigen), findet er stattdessen keine App-Daten und schlägt mit der Ausnahme fehl, die Sie gemeldet haben.

Der Nebeneffekt von ClientTLSOptions ist ein wenig unangenehm, aber ich denke, das ist eindeutig ein scrapy Bug verursacht durch Missbrauch/Missbrauch von ClientTLSOptions. Ich glaube nicht, dass dieser Code jemals sehr gut getestet werden konnte, da dieser Fehler jedes Mal auftritt, wenn ein Zertifikat nicht verifiziert werden kann.

Ich schlage vor, den Fehler Scrapy zu melden. Hoffentlich können sie ihre Verwendung von ClientTLSOptions beheben und diesen Fehler für Sie beseitigen.

21

konnte ich dieses Problem lösen, indem das service_identity Paket installieren:

pip install service_identity

+5

Das Problem wurde behoben. Vielen Dank. – thedp

+1

Was ist das für Hexerei? Gleicher Fehler, behoben sofort. Danke –

+0

ändert nichts für mich – Aldarund

0

ich in der Lage war, das Problem durch Ersetzen https zu lösen: // mit http: // in allen Bild Links vor dem Senden sie zur imagepipeline