Scrapy 中的 Pipeline 为我们提供了处理数据的功能,在实际开发中我们经常使用它来清洗/验证数据、去重和数据保存。在一个项目中会存在多种 Pipeline ,每个 Pipeline 都是一个 class ,其中包含了一些处理的 Item 的方法。 Item 会在这些 Pipeline 中按顺序依次传递,如果其中一个 Pipeline 丢弃了 Item ,那么后面未执行到的 Pipeline 将不会收到这个 Item 。
自定义 Pipeline 其实很简单,只需要实现指定的方法即可。
1.process_item (self,item,spider)
Tip : 如果在 process_item 方法中丢弃了 Item ,那么这个 Item 将不会向后续 Pipeline 传递这个 Item 。
2.open_spider(self,spider)
3.close_spider(self,spider)
4.from_crawl(self,crawler)
在一些项目中我们不仅要爬取网页的数据,还需要爬取文件或图片,并保存在本地。这时我们就需要用到 Scrapy 中特殊的 Pipeline :FilesPipeline 和 ImagesPipeline ,它们具有一些相同的方法和结构与,我们称这种 Pipeline 为 MediaPipeline 。FilesPipeline 和 ImagesPipeline 都包含如下特性:
ImagesPipeline 又包含如下特性:
Tip:Scrapy Pipeline 避免重复下载的方法是将要下载的文件的 URL 放入一个队列中,并且和 Response 关联,从而避免了重复下载。
1.FilesPipeline
FilesPipeline 下载文件的工作流程非常简单,一共有四个步骤:
2.ImagesPipeline
ImagesPipeline 是继承自 FilesPipeline ,也就是说它的大部分步骤和 FilesPipeline 一样。 唯一不同的是 ImagesPipeline 将需要下载的图片 URL 保存到了 image_urls 中,下载完成的结果保存到 images 中。
Tip:Pipeline 中不仅仅包含了这两个特殊的 Pipeline ,因为 FilesPipeline 和 ImagesPipeline 是比较常用的,因此我在这里进行了讲解。更多的内置 Pipeline 大家可以去 Scrapy 官网查看具体的文档。
我们在编写完 Pipeline 后需要在 settings.py 文件中进行注册,将我们编写的 Pipeline 注入到 Scrapy 中。
ITEM_PIPELINS= {
'自定义Pipeline 路径':'优先级'
}
本篇文章主要讲解了 Pipeline 的理论知识,虽然很短,但是这些知识是 Pipeline 的核心知识。下一节我将通过代码的形式来展现 Pipeline 的使用。