Как повторить запрос N раз, когда элемент получает пустое поле?

Я пытаюсь выбросить ряд веб-страниц, но у меня есть дыры, иногда кажется, что веб-сайт не может отправить html-ответ правильно. Это приводит к тому, что выходной файл csv имеет пустые строки. Как сделать, чтобы повторить n раз запрос и синтаксический анализ, когда селектор xpath в ответе пуст ? Обратите внимание, что у меня нет ошибок HTTP.

2 ответов


вы можете сделать это с помощью пользовательского промежуточного программного обеспечения повтора, вам просто нужно переопределить process_response метод текущего Повторить Промежуточное ПО:

from scrapy.downloadermiddlewares.retry import RetryMiddleware
from scrapy.utils.response import response_status_message


class CustomRetryMiddleware(RetryMiddleware):

    def process_response(self, request, response, spider):
        if request.meta.get('dont_retry', False):
            return response
        if response.status in self.retry_http_codes:
            reason = response_status_message(response.status)
            return self._retry(request, reason, spider) or response

        # this is your check
        if response.status == 200 and response.xpath(spider.retry_xpath):
            return self._retry(request, 'response got xpath "{}"'.format(spider.retry_xpath), spider) or response
        return response

затем включите его вместо default RetryMiddleware на settings.py:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
    'myproject.middlewarefilepath.CustomRetryMiddleware': 550,
}

теперь у вас есть промежуточное ПО, где вы можете настроить xpath чтобы повторить попытку внутри вашего паука с атрибутом retry_xpath:

class MySpider(Spider):
    name = "myspidername"

    retry_xpath = '//h2[@class="tadasdop-cat"]'
    ...

это не обязательно повторится, когда поле вашего товара пусто, но вы можете укажите тот же путь этого поля в this retry_xpath атрибут, чтобы заставить его работать.


Вы можете установить RETRY_TIMES настройка в settings.py к количеству раз, когда вы хотите, чтобы страницы были повторены. По умолчанию 2 раза.

посмотреть подробнее о RetryMiddleware