Scrapy Pipeline

Scrapy 中的 Pipeline 为我们提供了处理数据的功能,在实际开发中我们经常使用它来清洗/验证数据、去重和数据保存。在一个项目中会存在多种 Pipeline ,每个 Pipeline 都是一个 class ,其中包含了一些处理的 Item 的方法。 Item 会在这些 Pipeline 中按顺序依次传递,如果其中一个 Pipeline 丢弃了 Item ,那么后面未执行到的 Pipeline 将不会收到这个 Item 。

零、自定义 Pipeline

自定义 Pipeline 其实很简单,只需要实现指定的方法即可。

1.process_item (self,item,spider)

  • 解释:该方法必须实现,处理数据的工作都在这个方法中进行,方法返回 dict 、Item 、 Twisted Deferred 或者是 DropItem 异常。
  • 参数:
    • item : 被爬取的 Item ;
    • spider : 爬取 Item 时所使用的 Spider 。

Tip : 如果在 process_item 方法中丢弃了 Item ,那么这个 Item 将不会向后续 Pipeline 传递这个 Item 。

2.open_spider(self,spider)

  • 解释:爬虫开始运行时,将会在这个方法中执行一些初始化工作,例如打开数据库、打开文件等。
  • 参数:
    • spider : 当前正在使用的 Spider

3.close_spider(self,spider)

  • 解释:爬虫关闭时,将会在这个方法中执行一些后续工作,例如关闭数据库、关闭文件等。
  • 参数:
    • spider : 当前正在使用的 Spider

4.from_crawl(self,crawler)

  • 解释:方法为类方法,通过初始化 crawler 对象返回 Pipeline 实例。我们可以通过 crawler 返回所有 Scrapy 核心组件。

一、特殊的 Pipeline

在一些项目中我们不仅要爬取网页的数据,还需要爬取文件或图片,并保存在本地。这时我们就需要用到 Scrapy 中特殊的 Pipeline :FilesPipeline 和 ImagesPipeline ,它们具有一些相同的方法和结构与,我们称这种 Pipeline 为 MediaPipeline 。FilesPipeline 和 ImagesPipeline 都包含如下特性:

  • 避免重复下载数据
  • 指定存储位置

ImagesPipeline 又包含如下特性:

  • 图片转换为 JPG 格式或者 RGB 格式
  • 生成缩略图
  • 限制图片下载的最大/最小宽高

Tip:Scrapy Pipeline 避免重复下载的方法是将要下载的文件的 URL 放入一个队列中,并且和 Response 关联,从而避免了重复下载。

1.FilesPipeline

FilesPipeline 下载文件的工作流程非常简单,一共有四个步骤:

  • 爬虫把获取到的 Item 和希望下载的文件的 URL 保存到 file_urls 中;
  • 爬虫返回的 Item 进入到 Pipeline 内部;
  • Item 按照顺序传递到 FilesPipeline 时,file_urls 中的 URL 会被内置的调度器和下载器下载。在这个时候 Item 是被锁定的,直到需要下载的文件下载完成或者报错,Item 才解除锁定;
  • 下载完成后,结果将被保存在 files 中,files 是一个列表,每条数据是 dict 类型。

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 的使用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Scrapy Shell

    这篇文章很简单,可以说是 Scrapy 系列中最短最简单的文章。本篇文章主要讲解 Scrapy Shell 的相关知识。

    喵叔
  • Scrapy 爬虫模板--XMLFeedSpider

    XMLFeedSpider 主要用于 RSS 的爬取。RSS 是基于 XML 的信息局和技术。这篇文章的最后一下小结我会利用爬取经济观察网 RSS 的例子来讲解...

    喵叔
  • C# 三个Timer

    Timer 计时器是在C#开发中经常用到的,但是有很多开发人员对他并不了解,今天这篇文将我们就具体讲解一下C#中的计时器。

    喵叔
  • Jenkins高级教程 - Pipeline 安装

    Pipeline,简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视...

    晓晨
  • Jenkins之声明式pipeline基础

    Jenkins 2.0的到来,pipline进入了视野,jenkins2.0的核心特性。也是最适合持续交付的feature。

    苦叶子
  • Redis使用Pipeline加速查询速度

    Redis 是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下 Redis 客户端执行一条命令分为如下四个过程:

    smartsi
  • Jenkins Pipeline插件十大最佳实践!

    Jenkins Pipeline 插件对于 Jenkins 用户来说可以让用户能够改变游戏规则。基于 Groovy 中的领域特定语言(DSL),Pipeline...

    程序猿DD
  • [案例]美联航如何使用大数据

    大数据文摘
  • 干货:Spark在360商业数据部的应用实践

    随着数据规模的持续增长,数据需求越来越多,原有的以MapReduce为代表的Hadoop平台越来越显示出其局限性。主要体现在以下两点:

    华章科技
  • Hadoop、Spark、Kafka面试题及答案整理

    一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成。

    大数据技术架构

扫码关注云+社区

领取腾讯云代金券