Ich benutze Scrapy 1.1 und ich rufe Scrapy aus einem Skript heraus. Meine Spinne Abschuss Methode sieht wie folgt aus:Ich habe einen Fehler für meine Scrapy-Spinne geschrieben, aber Tracebacks passieren auch weiterhin, warum?
def run_spider(self):
runner = CrawlerProcess(get_project_settings())
spider = SiteSpider()
configure_logging()
d = runner.crawl(spider, websites_file=self.raw_data_file)
d.addBoth(lambda _: reactor.stop())
reactor.run()
Hier ein Auszug meiner Spinne mit einem errback wie in der Dokumentation geschrieben, aber es druckt nur, wenn fängt einen Ausfall.
class SiteSpider(scrapy.Spider):
name = 'SiteCrawler'
custom_settings = {
'FEED_FORMAT': 'json',
'FEED_URI': 'result.json',
}
def __init__(self, websites_file=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.websites_file = websites_file
print('***********')
print(self.websites_file)
def start_requests(self):
.....
if is_valid_url(website_url):
yield scrapy.Request(url=website_url, callback=self.parse, errback=self.handle_errors, meta={'url': account_id})
def parse(self, response):
.....
yield item
def handle_errors(self, failure):
if failure.check(HttpError):
# these exceptions come from HttpError spider middleware
# you can get the non-200 response
response = failure.value.response
print('HttpError on ' + response.url)
elif failure.check(DNSLookupError):
# this is the original request
request = failure.request
print('DNSLookupError on ' + request.url)
elif failure.check(TimeoutError, TCPTimedOutError):
request = failure.request
print('TimeoutError on ' + request.url)
Mein Problem ist, dass ich Fehler erhalte ich erwarten, wie:
TimeoutError on http://www.example.com
Aber auch Tracebacks für die gleichen Websites erhalten:
2016-08-05 13:40:55 [scrapy] ERROR: Error downloading <GET http://www.example.com/robots.txt>: TCP connection timed out: 60: Operation timed out.
Traceback (most recent call last):
File ".../anaconda/lib/python3.5/site-packages/twisted/internet/defer.py", line 1126, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File ".../anaconda/lib/python3.5/site-packages/twisted/python/failure.py", line 389, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
File ".../anaconda/lib/python3.5/site-packages/scrapy/core/downloader/middleware.py", line 43, in process_request
defer.returnValue((yield download_func(request=request,spider=spider)))
twisted.internet.error.TCPTimedOutError: TCP connection timed out: 60: Operation timed out.
Die schriftliche Ausnahmebehandlung Nachrichten und die Tracebacks kann oft auf die gleichen Websites zurückverfolgt werden. Nachdem ich viel auf stackoverflow, in den Dokumenten und in den Gleichen gesucht habe, weiß ich nicht, warum ich die tracebacks sehe. Dies tritt auch bei DNSLookupErrors zum Beispiel auf. Entschuldigung, mein Scrapy-Wissen ist jugendlich. Ist das normales Verhalten?
Auch ich habe dies zu settings.py hinzugefügt, die unter meinem Crawler ist. Andere Ganzheiten (zum Beispiel die item_pipelines) funktionieren am genauesten.
LOG_LEVEL = 'WARNING'
Aber ich sehe immer noch Debug-Meldungen, nicht nur Warnungen und alles darüber. (Wenn configure_logging() zum Start der Spider hinzugefügt wird) Ich führe dies vom Terminal auf Mac OS X. Ich würde mich sehr freuen, irgendeine Hilfe dabei zu bekommen.