Как обрабатывать временные ошибки, которые не сигнализируются кодом состояния http? - PullRequest
0 голосов
/ 28 июня 2018

Я пишу сканер с использованием Scrapy (Python) и не знаю, как обрабатывать определенные ошибки.

У меня есть сайт, который иногда возвращает пустое тело или обычную страницу с сообщением об ошибке. Оба ответа поставляются со стандартным кодом состояния HTTP 200.

Что я хочу делать, когда сталкиваюсь с такой ситуацией, так это сказать Scrapy

  • не сохраняйте ответ в кеш (я использую HTTPCACHE_ENABLED = True), так как содержимое для успешного запроса выглядит иначе
  • перенести запрос
  • уменьшить частоту запросов (я использую AUTOTHROTTLE_ENABLED = True)

Есть ли простой способ, например, вызвать определенное исключение а-ля raise scrapy.TemporaryError, или я должен делать все вручную В последнем случае, как мне удалить содержимое из кеша или поговорить с модулем автоматического регулирования?

Я знаю, что могу использовать dont_cache для запросов, чтобы не кэшировать их. Но обычно я хочу кэшировать свои запросы и принимать решение только по ответу, если хочу его сохранить. Также документация не ясна, если этот флаг избегает сохранения ответа на запрос в кэш или , если он также избегает чтения запроса из кеша ...

Autothrottle использует задержку загрузки для настройки частоты запросов. Алгоритм регулирования 1026 * обрабатывает не 200 ответов как ошибочные ответы и не уменьшает задержку загрузки. Однако мои запросы возвращают 200 кодов состояния. Таким образом, автомат тяги не может справиться с ситуацией. Должен быть способ заставить autothrottle использовать его логику регулирования и обрабатывать эти конкретные запросы как неудачные.

1 Ответ

0 голосов
/ 28 июня 2018

В своем ответе вы можете проверить условие и принять решение о добавлении URL в очередь.

запросы исчезают после очередей в scrapy

def parse(self, response):
    if blank_data or should_rescrape:
       yield Request(respone.url, dont_filter=True, callback=self.response)

Динамическая регулировка дросселя

Если вы отметите self.crawler.extensions.middlewares, вы увидите, что у него есть все загруженные расширения

В моем случае

self.crawler.extensions.middlewares[5] дает <scrapy.extensions.throttle.AutoThrottle object at 0x10b75a208> (Конечно, вы пройдете по кортежу и найдете, какой из них имеет тип AutoThrottle)

Throttling

Теперь вы можете использовать этот объект и динамически корректировать значения в своем скребке

...