Как повторить IndexError в Scrapy - PullRequest
0 голосов
/ 23 октября 2018

Иногда я получаю IndexError, потому что я успешно очищаю только половину страницы, в результате чего логика синтаксического анализа получает IndexError.Как мне повторить попытку, когда я получу IndexError?

В идеале это промежуточное ПО, поэтому оно может обрабатывать сразу несколько пауков.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

В конце я использую декоратор и вызываю функцию _retry() из RetryMiddleware в функции декоратора.Это работает хорошо.Это не самое лучшее, лучше всего иметь промежуточное программное обеспечение для его обработки.Но это лучше, чем ничего.

from scrapy.downloadermiddlewares.retry import RetryMiddleware

def handle_exceptions(function):
    def parse_wrapper(spider, response):
        try:
            for result in function(spider, response):
                yield result
        except IndexError as e:
            logging.log(logging.ERROR, "Debug HTML parsing error: %s" % (unicode(response.body, 'utf-8')))
            RM = RetryMiddleware(spider.settings)
            yield RM._retry(response.request, e, spider)
    return parse_wrapper

Тогда я использую декоратор так:

@handle_exceptions
def parse(self, response):
0 голосов
/ 23 октября 2018

Если вы предполагаете, что страница должна быть перезагружена при возникновении ошибки, вы можете попробовать:

max_retries = 5

def parse(self, response):
    # to avoid getting stuck in a loop only retry x times
    retry_count = response.meta.get('retry_count', 0)

    item = {}
    try:
        item['foo'] = response.xpath()[123]
        ...
    except IndexError as e:
        if retry_count == max_retries:
            print(f'max retries reached for {response.url}: {e}')
            return
        yield Request(
            response.url, 
            dont_filter=True, 
            meta={'retry_count': retry_count+1}
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...