Как повторить запрос 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