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学习之asyncore模块用法实例教程
Sep 29 Python
浅析Python中的多条件排序实现
Jun 07 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
python实现串口自动触发工作的示例
Jul 02 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
简单了解python PEP的一些知识
Jul 13 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
什么是python的函数体
Jun 19 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 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
一个基于PDO的数据库操作类
2011/03/24 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
jQuery的学习步骤
2011/02/23 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
Python装饰器的函数式编程详解
2015/02/27 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
编辑找工作求职信范文
2013/12/16 职场文书
总经理助理的职责
2014/03/14 职场文书
班委竞选演讲稿
2014/04/28 职场文书
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL
MYSQL常用函数介绍
2022/05/05 MySQL