Написал errback для моего паука Scrapy, но трассировки тоже продолжают происходить, почему?

Я использую Scrapy 1.1 и вызываю Scrapy из скрипта. Мой способ запуска паука выглядит так:

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()

Вот выдержка из моего паука с errback, написанным как в документации, но он печатает только тогда, когда ловит сбой.

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)

Моя проблема в том, что я получаю ожидаемые ошибки, например:

TimeoutError on http://www.example.com

Но также получите трассировку для тех же веб-сайтов:

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.

Письменные сообщения об обработке исключений и обратные трассировки часто можно проследить до одних и тех же веб-сайтов. После долгих поисков в stackoverflow, в документах и ​​тому подобное, я до сих пор не знаю, почему я вижу трассировку. Это также происходит, например, с DNSLookupErrors. Извините, мои познания в Scrapy еще несовершенны. Это нормальное поведение?

Кроме того, я добавил это в settings.py, который находится под моим поисковым роботом. Другие целые (например, item_pipelines) наиболее точно работают.

LOG_LEVEL = 'WARNING'

Но я все еще вижу сообщения отладки, а не только предупреждения и все, что выше этого. (если configure_logging() добавлен к запуску паука) Я запускаю это с терминала на mac os x. Я был бы очень рад получить любую помощь в этом.


person narkr    schedule 05.08.2016    source источник


Ответы (1)


Попробуйте это в скрипте:

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()
person mikuyves    schedule 27.01.2017