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

thi*_*007 5 python scrapy

我正在使用 scrapy 对内部 Web 应用程序执行测试。完成所有测试后,我使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 2

  1. 请求的默认优先级为0,因此将优先级设置为50将不起作用
  2. 您可以使用中间件来收集(将请求插入到您自己的队列中,例如redis集)并忽略(返回IngnoreRequest Exception)那些“删除”请求
  3. 使用步骤 2 中从队列中加载的请求开始第二次爬网