Scrapy - 针对不同域的不同download_delay

葛明洋*_*葛明洋 2 python scrapy

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

有关该方案的一些信息:

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

当我必须限制主域的下载速度时,如何加快图像下载速度?

Mik*_*bov 7

它没有公共接口(因此我的答案在将来的Scrapy版本中可能无效),但您可以检查内置AutoThrottle扩展的实现.

它有点复杂,但在Scrapy 1.0中的想法如下:有Downloader可以处理所有下载.决定并行发送的请求数和使用Downloader的延迟使用"时隙".通过更改插槽属性(delay,concurrency),您可以更改下载程序行为.默认情况下,每个域(或每个IP地址,如果设置了CONCURRENT_REQUESTS_PER_IP选项)有一个插槽.您还可以通过设置自定义将请求路由到任何其他插槽request.meta['download_slot'].

所有插槽的延迟和并发的默认值是使用scrapy设置或蜘蛛属性设置的download_delay.但是你可以在Scrapy扩展中在运行时调整它们 - 这就是AutoThrottle正在做的事情.要为不同的请求使用不同的下载延迟,您需要delay在适当的插槽中更改属性.

当您的请求被发送到不同的域时,任务被简化 - 插槽已经不同,您需要找到它们并更改delay值.如果您想对单个网站的不同部分使用不同的延迟,则必须使用自定义插槽request.meta['download_slot'].

对不起,我不会提供一个现成的例子,但希望这会有所帮助.如果不清楚从哪里开始,请随意提出更多问题.

此外,可能只是启用AutoThrottle扩展就是您所需要的,并且无需编写自定义扩展 - 首先尝试.

另一个更简单的选择是创建2个蜘蛛并为它们设置不同的下载延迟:第一个下载页面并提取/存储图像链接,第二个下载图像.

  • 谢谢!您的答案非常彻底和明确,我通过自定义AuthoTrottle解决了我的程序.这是我的代码:[github](https://github.com/gavinhub/Jandan.EPUB/blob/master/PaJandan/extensions/throttle.py) (3认同)