Item Pipeline
当Item在Spider中被生成之后,它将被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。
每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃还是存储。一下是Item Pipeline的一些典型应用:
- 验证爬取的数据(检查Item是否包含某些字段)- 查重(并丢弃)- 将爬取的结果保存到文件或者数据库中
编写Item pipeline
编写item pipeline很简单,item pipeline组件是一个独立的Python类,其中process_item()方法必须实现:
class NewsPipeline(obejct):# 可选实现,做参数初始化等(仅被调用一次)def __init__(self):passdef open_spider(self, spider):# spider(Spider对象)——开启的Spider# 可选实现,当Spider被开启时,该方法会被调用(仅被调用一次)passdef process_item(self, item, spider):# item(Item对象)——Spider生成的Item对象# spider(Spider对象)——爬取该item的Spider# 这个方法必须实现,每处理一个item就需要调用一次该方法# 该方法最后必须要返回一个Item对象,如果没有返回,被该方法处理过的item不会被后续的pipeline文件处理。# 同时,引擎也会不知道当前item是否被处理完成。return itemdef close_spider(self, spider):# spider(Spider对象)——被关闭的spider# 可选实现,当spider停止时,该方法会被调用(仅被调用一次)pass
实例演示—将item数据保存到JSON文件中
import jsonclass NewsPipeline:# 做一些初始化的事情def __init__(self):self.fw = open('news_pipeline.json', 'w', encoding='utf-8')# 处理Item对象的方法def process_item(self, item, spider):# 将Item对象转换为JSON# 首先将Item对象转换为一个dictitem_dict = dict(item)# 在将字典转换为JSON字符串content = json.dump(item_dict, ensure_ascii=False) + ',\n'self.fw.write(content)# 注意写入完文件后要将item返回,返回给 引擎, 告诉 引擎这个item已经被处理完了# 如果此处不返回,信号就中断了,引擎无法得知item是否已经被处理完return item# 当Spider停止时,会调用该方法def close_spider(self, spider):self.fw.close()
启用一个Item Pipeline组件
当Item Pipeline管道文件编写完成后,需要进行启用。即将管道类添加到settings.py文件中的ITEM_PIPELINE进行配置。如下所示:
# Configure item pipelines# See https://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES = {'News.pipelines.NewsPipeline': 300,}
从上述实例可以看出,ITEM_PIPELINES是以字典的方式进行配置,可以配置多个管道。并且在配置的时候会分配给每个类一个整型的值,scrapy引擎就是通过这个值确定管道类的执行顺序,item按数字从低到高的顺序,通过pipeline。通常将这些数字定义在0-1000范围内(0-1000随意设置,数值越低,管道类的优先级越高)
启动爬虫
执行下述命令,启动爬虫:scrapy crawl news
注意:在那个目录下执行上述命令,爬取的数据就会存在哪个目录下。
