我正在使用scrapy从网站下载一些文章以及文章中的图像.
有关该方案的一些信息:
download_delay为避免<403>错误scrapy.contrib.pipeline.images.ImagesPipelinedownload_delay设置的限制当我必须限制主域的下载速度时,如何加快图像下载速度?
它没有公共接口(因此我的答案在将来的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个蜘蛛并为它们设置不同的下载延迟:第一个下载页面并提取/存储图像链接,第二个下载图像.