2016-08-05 49 views
0

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.

Antwort

-1

Versuchen Sie, diese in einem Skript:

if __name__ == '__main__': 
    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()