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 的使用。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 动态加载 ExtJS 类库
- Visual Studio 2013 下 NuGet 无法识别自定义包路径的解决方法
- Xcode 5 中 xib 文件格式的调整
- 调用新浪微博显示用户信息
- 如何用代码动态生成ABAP类型
- 使用自签名证书内部分发 iOS7 应用
- 在 MvvmCross 下使用 iOS Storyboard
- 动态隐藏某些特殊类型的SAP CRM附件
- 设计模式之生成器模式
- Git 客户端保存用户名和密码
- SAP WebClient UI component模型元数据解析工具
- 设计模式之抽象工厂模式
- 测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)
- 设计模式之代理模式
- SQL Server 中的 ROW_NUMBER 函数