我正在使用 scrapy 从网站下载一些文章以及文章中的图像。
有关场景的一些信息:
download_delay
以避免<403>错误scrapy.contrib.pipeline.images.ImagesPipeline
download_delay
设置的限制如何在必须限制主域下载速度的情况下加快图像下载速度?
它没有公共接口(所以我的答案可能在未来的Scrapy版本中变得无效),但您可以检查内置AutoThrottle扩展的实现。
有点复杂,但在 Scrapy 1.0 中,想法如下:有一个 Downloader 来处理所有下载。为了决定并行发送多少个请求以及使用哪些延迟,下载器使用“槽”。通过更改插槽属性(
delay
、concurrency
),您可以更改下载程序的行为。默认情况下,每个域都有一个插槽(如果设置了 CONCURRENT_REQUESTS_PER_IP 选项,则每个 IP 地址都有一个插槽)。您还可以通过设置自定义 request.meta['download_slot']
将请求路由到任何其他插槽。
所有槽的延迟和并发的默认值是使用 scrapy 设置或蜘蛛属性(如
download_delay
)设置的。但是您可以在运行时在 Scrapy 扩展中调整它们 - 这就是 AutoThrottle 正在做的事情。要对不同的请求使用不同的下载延迟,您需要更改适当插槽中的 delay
属性。
当您的请求被发送到不同的域时,任务就被简化了 - 插槽已经不同,您需要找到它们并更改
delay
值。如果您想对单个网站的不同部分使用不同的延迟,则必须使用 request.meta['download_slot']
设置自定义插槽。
抱歉,我不会提供现成的示例,但希望这会有所帮助。如果不清楚如何处理,请随时提出更多问题。
此外,可能只需要启用 AutoThrottle 扩展即可,无需编写自定义扩展 - 首先尝试一下。
另一个更简单的选项是创建 2 个蜘蛛并为它们设置不同的下载延迟:第一个下载页面并提取/存储图像链接,第二个下载图像。
现在您可以为此目的在设置中设置 DOWNLOAD_SLOTS!查看文档:https://docs.scrapy.org/en/2.10/topics/settings.html#download-slots