5

我正在使用 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调用信号时将它们放回原处,但我不确定如何执行此操作。

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

4

1 回答 1

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