在 Scrapy 中限制请求

Throttle Requests in Scrapy

我正在开发一个带有 Scrapy 的蜘蛛,它通过一个键控 url 进行迭代。例如,它将使用 url 作为模板(例如 https:\google.com{key})。我遇到了一个问题,我无法让它在正确的时间停止迭代那些 urls。例如,如果我开始收到足够多的失败请求,例如 404,我想终止,这样我就不会发送比需要更多的请求。

我试图引发 CloseSpider()。这部分有效。它会停止蜘蛛,但不会在某些请求完成之前停止。

然后我尝试不断地产生请求,同时跟踪有多少请求已执行/失败。问题是我不认为 Scrapy 可以从 start_requests 异步 运行。

我确实需要两种解决方案之一:

1) 一种从 Scrapy 中动态生成 start_requests 结果的方法(从另一篇文章来看,这似乎不可能)。这样我就可以跟踪当前的错误,并且只在我完成生成结果时完成知道我还没有达到某个错误阈值。

2) 当抛出CloseSpider 异常时,如何让已经下载的页面通过它们的回调和管道完成处理。这样任何非 404 命中都可以完成。

我想到了这个 out.Since 我正在按键控顺序遍历,期望键最终不存在,我需要配置 scrapy 以 FIFO 顺序工作,而不是 settings.py 中的默认 LIFO 顺序:

    DEPTH_PRIORITY = 1
    SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
    SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

我还确保了 2 和 3 深度请求的优先级高于启动请求。然后,通过跟踪 404,我能够在完成所有预期结果的情况下引发 CloseSpider 异常。