返回介绍

12.9 构建 Item Pipeline

发布于 2024-01-26 22:39:51 字数 1891 浏览 0 评论 0 收藏 0

以上几节已经实现了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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文