我正在使用scrapy从网站下载一些文章以及文章中的图像。
有关该方案的一些信息:
download_delay
以避免< 403>错误scrapy.contrib.pipeline.images.ImagesPipeline
download_delay
设置如何在限制主域下载速度的同时加快图像下载速度?
答案 0 :(得分:7)
没有公共界面(所以我的答案在将来的Scrapy版本中可能会失效),但您可以检查内置AutoThrottle扩展程序的实现。
这有点复杂,但在Scrapy 1.0中的想法如下:有Downloader可以处理所有下载。决定并行发送的请求数和使用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个蜘蛛并为它们设置不同的下载延迟:第一个下载页面并提取/存储图像链接,第二个下载图像。