Я нашел способ обработки этих «скрытых» перенаправлений:
- Поймать сигнал '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
Надеюсь, это может помочь вам, если вы столкнетесь с той же проблемой.