Python:Scrapy框架中Item Pipeline组件使用详解


Posted in Python onDecember 27, 2017

Item Pipeline简介

Item管道的主要责任是负责处理有蜘蛛从网页中抽取的Item,他的主要任务是清晰、验证和存储数据。
当页面被蜘蛛解析后,将被发送到Item管道,并经过几个特定的次序处理数据。
每个Item管道的组件都是有一个简单的方法组成的Python类。
他们获取了Item并执行他们的方法,同时他们还需要确定的是是否需要在Item管道中继续执行下一步或是直接丢弃掉不处理。

Item管道通常执行的过程有

清理HTML数据
验证解析到的数据(检查Item是否包含必要的字段)
检查是否是重复数据(如果重复就删除)
将解析到的数据存储到数据库中

编写自己的Item Pipeline

编写item管道其实是很容易的。
每个Item管道的组件都是由一个简单的方法组成的Python类:

process_item(item, spider)

每一个item管道组件都会调用该方法,并且必须返回一个item对象实例或raise DropItem异常。
被丢掉的item将不会在管道组件进行执行
此外,我们也可以在类中实现以下方法

open_spider(spider)

当spider执行的时候将调用该方法

close_spider(spider)

当spider关闭的时候将调用该方法
Item Pipeline例子

代码如下:

from scrapy.exceptions import DropItem 
 
class PricePipeline(object): 
 
  vat_factor = 1.15 
 
  def process_item(self, item, spider): 
    if item['price']: 
      if item['price_excludes_vat']: 
        item['price'] = item['price'] * self.vat_factor 
      return item 
    else: 
      raise DropItem("Missing price in %s" % item)

注:VAT:ValueAddedTax(增值税)

以上代码可以过滤那些没有价格的产品,并且对那些不包括增值税产品的价格进行调整

将抓取的items以json格式保存到文件中

从spider抓取到的items将被序列化为json格式,并且以每行一个item的形式被写入到items.jl文件中

代码:

import json 
 
class JsonWriterPipeline(object): 
 
  def __init__(self): 
    self.file = open('items.jl', 'wb') 
 
  def process_item(self, item, spider): 
    line = json.dumps(dict(item)) + "\n" 
    self.file.write(line) 
    return item

注:JsonWriterPipeline的目的是介绍如何编写项目管道。如果想要保存抓取的items到json文件中,推荐使用Feedexports

删除重复项

假设在spider中提取到的item有重复的id,那么我们就可以在process_item函数中进行过滤

如:

from scrapy.exceptions import DropItem 
 
class DuplicatesPipeline(object): 
 
  def __init__(self): 
    self.ids_seen = set() 
 
  def process_item(self, item, spider): 
    if item['id'] in self.ids_seen: 
      raise DropItem("Duplicate item found: %s" % item) 
    else: 
      self.ids_seen.add(item['id']) 
      return item

激活ItemPipeline组件

在settings.py文件中,往ITEM_PIPELINES中添加项目管道的类名,就可以激活项目管道组件

如:

ITEM_PIPELINES = { 
  'myproject.pipeline.PricePipeline': 300, 
  'myproject.pipeline.JsonWriterPipeline': 800, 
}

The integer values you assign to classes in this setting determine the order they run in- items go through pipelines from order number low to high

整数值通常设置在0-1000之间

总结

以上就是本文关于Python:Scrapy框架中Item Pipeline组件使用详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python正则表达式re模块详解
Jun 25 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
python儿童学游戏编程知识点总结
Jun 03 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
Python中新式类与经典类的区别详析
Jul 10 Python
分享PyCharm的几个使用技巧
Nov 10 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
python搜索算法原理及实例讲解
Nov 18 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
Python实现智慧校园自动评教全新版
Jun 18 Python
手把手教你python实现SVM算法
Dec 27 #Python
Python中使用支持向量机SVM实践
Dec 27 #Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 #Python
Python简单生成随机姓名的方法示例
Dec 27 #Python
ubuntu中配置pyqt4环境教程
Dec 27 #Python
Python中Threading用法详解
Dec 27 #Python
SVM基本概念及Python实现代码
Dec 27 #Python
You might like
php cout<<的一点看法
2010/01/24 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
PHP中Array相关函数简介
2016/07/03 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
Python内置函数之filter map reduce介绍
2014/11/30 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
争论的故事教学反思
2014/02/06 职场文书
教师一岗双责责任书
2014/04/16 职场文书
留学生求职信
2014/06/03 职场文书
三方协议书
2015/01/27 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
运动会开幕式主持词
2015/07/01 职场文书
技能培训通讯稿
2015/07/18 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
SQL Server实现分页方法介绍
2022/03/16 SQL Server