12.9 构建 Item Pipeline
以上几节已经实现了cnblogs爬虫中网页的下载、解析和数据Item,下面我们需要将爬取到的数据进行持久化存储,这就要说到Item Pipeline。当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
Item Pipeline主要有以下典型应用:
·清理HTML数据。
·验证爬取的数据的合法性,检查Item是否包含某些字段。
·查重并丢弃。
·将爬取结果保存到文件或者数据库中。
12.9.1 定制Item Pipeline
定制Item Pipeline的方法其实很简单,每个Item Pipeline组件是一个独立的Python类,必须实现process_item方法,方法原型如下:
process_item(self, item, spider)
每个Item Pipeline组件都需要调用该方法,这个方法必须返回一个Item(或任何继承类)对象,或者抛出DropItem异常,被丢弃的Item将不会被之后的Pipeline组件所处理。
参数说明:
·Item对象是被爬取的Item。
·Spider对象代表着爬取该Item的Spider。
我们需要将cnblogs爬虫爬取的Item存储到本地。定制的Item Pipeline代码位于cnblogSpider/pipelines.py,声明为CnblogspiderPipeline类,完整内容如下:
import json from scrapy.exceptions import DropItem class CnblogspiderPipeline(object): def __init__(self): self.file = open('papers.json', 'wb') def process_item(self, item, spider): if item['title']: line = json.dumps(dict(item)) + "\n" self.file.write(line) return item else: raise DropItem("Missing title in %s" % item)
process_item方法中,先对item中的title进行判断,如果不存在就抛出DropItem异常,进行丢弃,如果存在就将item存入JSON文件中,你可以定制自己想存储的方式,比如存到数据库中等。
12.9.2 激活Item Pipeline
定制完Item Pipeline,它是无法工作的,需要进行激活。要启用一个Item Pipeline组件,必须将它的类添加到settings.py中的ITEM_PIPELINES变量中。代码如下:
ITEM_PIPELINES = { 'cnblogSpider.pipelines.CnblogspiderPipeline': 300, }
ITEM_PIPELINES变量中可以配置很多个Item Pipeline组件,分配给每个类的整型值确定了它们运行的顺序,item按数字从低到高的顺序通过Item Pipeline,通常将这些数字定义在0~1000范围内。
激活完成后,将命令行切换到项目目录下,执行scrapy crawl cnblogs命令,就可以将数据存储到papers.json文件中,效果如图12-11所示。
图12-11 papers.json
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论