Scrapy - 不同域的不同 download_delay

问题描述 投票:0回答:2

我正在使用 scrapy 从网站下载一些文章以及文章中的图像。

有关场景的一些信息:

  • 文章来自主域(jandan.net)
  • 文章中的图片来自其他网站。 (例如tankr.net)
  • 主域有访问频率限制,所以我必须设置
    download_delay
    以避免<403>错误
  • 图片由
    scrapy.contrib.pipeline.images.ImagesPipeline
  • 下载
  • 好像图片下载也受到
    download_delay
    设置的限制

如何在必须限制主域下载速度的情况下加快图像下载速度?

python scrapy
2个回答
9
投票

它没有公共接口(所以我的答案可能在未来的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 个蜘蛛并为它们设置不同的下载延迟:第一个下载页面并提取/存储图像链接,第二个下载图像。


-1
投票

现在您可以为此目的在设置中设置 DOWNLOAD_SLOTS!查看文档:https://docs.scrapy.org/en/2.10/topics/settings.html#download-slots

© www.soinside.com 2019 - 2024. All rights reserved.