如何保留重复项的重定向历史记录

时间:2018-12-09 12:49:28

标签: redirect scrapy duplicates

scrapys复制过滤器会忽略已经看到的url /请求。到目前为止,一切都很好。


问题

即使请求被丢弃,我仍然希望保留重定向历史记录。

示例:

  • 请求1:B
  • 请求2:A --301-> B

在这种情况下,请求2被丢弃而没有让我知道它是请求1的“隐藏”副本。


尝试

我已经尝试捕获信号request_dropped。这可行,但是我看不到从处理程序向管道发送项目的可能性。


最诚挚的问候,感谢您的帮助:)

拉斐尔

2 个答案:

答案 0 :(得分:0)

您可能正在寻找DUPEFILTER_DEBUG

True文件中将其设置为settings.py,您将看到由于重复而被忽略的所有URL

答案 1 :(得分:0)

我想出了一种处理那些“隐藏”重定向的方法:

  1. 从“ from_crawler”捕获信号“ request_dropped”:
    @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
  1. 使用'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)
  1. 在您定义的回调中处理已删除请求的重定向历史记录。在这里,您可以像在常规解析回调中一样处理事情。
def parse_redirection_from_dropped_request(self, response):
    ...
    yield item

如果您遇到相同的问题,希望对您有帮助。