Item Pipeline
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。
每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃还是存储。以下是Item Pipeline的一些典型应用:
- 验证爬取的数据(检查item包含某些字段,比如说name字段)
- 查重(并丢弃)
- 将爬取结果保存到文件或者数据库中
- 清理HTML数据
编写Item Pipeline
编写item pipeline很简单,item pipiline组件是一个独立的Python类,其中process_item()方法必须实现,另外还有几个比较实用的方法:open_spider()、close_spider()、from_crawler()
1 | class SomethingPipeline(object): |
process_item(self, item, spider):是必须要实现的方法,被定义的 Item Pipeline 会默认调用这个方法对 Item 进行处理。比如,我们可以进行数据处理或者将数据写入到数据库等操作。它必须返回 Item 类型的值或者抛出一个 DropItem 异常。
- item:是 Item 对象,即被处理的 Item。
- spider:是Spider对象,即生成该Item的Spider。
如果它返回的是Item对象,那么此Item会被低优先级的Item Pipeline的process_item()方法处理,直到所有的方法被调用完毕。
如果它抛出的是DropItem异常,那么此Item会被丢弃,不再进行处理。
open_spider(self, spider):open_spider()方法是在Spider开启的时候被自动调用的,在这里我们可以做一些初始化操作,如开启数据库连接等。
- spider:是被开启的Spider对象。
close_spider(self, spider):close_spider()方法是在Spider关闭的时候自动调用的,在这里我们可以做一些收尾工作,比如关闭数据库连接等。
- spider:是被关闭的Spider对象。
from_crawler(cls, crawler):from_crawler()方法是一个类方法,用@classmethod标识,是一种依赖注入的方式。
- cls:就是Class,返回一个Class实例。
- crawler:通过crawler对象,我们可以拿到Scrapy的所有核心组件,如全局配置的每个信息,然后创建一个Pipeline实例。
启用一个Item Pipeline组件
为了启用Item Pipeline组件,必须将它的类添加到 settings.py文件ITEM_PIPELINES 配置,就像下面这个例子:
1 | # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html |
分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内(0-1000随意设置,数值越低,组件的优先级越高)