Scrapy - 针对不同域

时间:2015-06-22 01:14:39

标签: python scrapy

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

有关该方案的一些信息:

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

如何在限制主域下载速度的同时加快图像下载速度?

1 个答案:

答案 0 :(得分:7)

没有公共界面(所以我的答案在将来的Scrapy版本中可能会失效),但您可以检查内置AutoThrottle扩展程序的实现。

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

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

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

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

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

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