как сохранить историю перенаправлений дубликатов - PullRequest
0 голосов
/ 09 декабря 2018

фильтр дублирования scrapys игнорирует уже увиденные URL / запросы.Пока все хорошо.


Проблема

Даже если запрос отброшен, я все равно хочу сохранить историю перенаправлений.

Пример:

  • Запрос 1: B
  • Запрос 2: A --301 -> B

В этом случаезапрос 2 отбрасывается, не давая мне знать, что это «скрытый» дубликат запроса 1.


Попытки

Я уже пытался поймать сигнал request_dropped,Это работает, но я не вижу возможности отправить элемент в конвейер из обработчика.


С уважением и благодарностью за вашу помощь:)

Рафаэль

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я нашел способ обработки этих «скрытых» перенаправлений:

  1. Поймать сигнал 'request_dropped' от 'from_crawler':
    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = super(YourSpider, cls).from_crawler(crawler, *args, **kwargs)
        crawler.signals.connect(spider.on_request_dropped, signal=signals.request_dropped)
        return spider
Используйте 'self.crawler.engine.scraper.enqueue_scrape', чтобы направить ответ на обратный вызов, который может привести к элементам.enqueue_scrape ожидает ответ, поэтому вы можете просто создать фиктивный ответ из отброшенного запроса (для этого я использовал TextResponse).С помощью этого ответа вы также можете определить обратный вызов.
    def on_request_dropped(self, request, spider):
        """ handle dropped request (duplicates) """

        request.callback = self.parse_redirection_from_dropped_request
        response = TextResponse(url=request.url, request=request)
        self.crawler.engine.scraper.enqueue_scrape(request=request, 
                                                   response=response, spider=self)
Обрабатывать историю перенаправления отброшенного запроса в указанном вами обратном вызове.Отсюда вы можете обрабатывать вещи точно так же, как в обычном обратном вызове синтаксического анализа.
def parse_redirection_from_dropped_request(self, response):
    ...
    yield item

Надеюсь, это может помочь вам, если вы столкнетесь с той же проблемой.

0 голосов
/ 10 декабря 2018

Вы, вероятно, ищете DUPEFILTER_DEBUG

Установите его в True в settings.py файле, и вы увидите все URL, которые были проигнорированы из-за дублирования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...