动态更改scrapy请求调度程序优先级

时间:2013-05-18 16:08:47

标签: python scrapy

我正在使用scrapy在内部网络应用上执行测试。 完成所有测试后,我使用CrawlSpider进行检查,我为每个响应运行HTML验证器,然后查找404媒体文件。

除此之外它工作得非常好:最后抓取,GET随机顺序的事情...... 因此,执行DELETE操作的URL正在执行其他操作之前。

我想在最后安排所有删除。我尝试了很多方式,使用这种调度程序:

来自scrapy导入日志

class DeleteDelayer(object):
    def enqueue_request(self, spider, request):
        if request.url.find('delete') != -1:
            log.msg("delay %s" % request.url, log.DEBUG)
            request.priority = 50

但是它不起作用......我看到删除在日志中是“延迟”,但它们在执行期间执行。

我想过使用一个可以在内存中堆积所有删除URL的中间件,并且在调用spider_idle信号时将它们重新放入,但我不确定如何执行此操作。

实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

  1. 请求的默认优先级为0,因此将优先级设置为50将无法正常工作
  2. 您可以使用中间件来收集(将请求插入您自己的队列,例如redis set)并忽略(返回IngnoreRequest Exception)那些'delete'请求
  3. 在第2步中从您的队列加载请求时开始第二次抓取