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运行效率的方法之间的对比
Apr 03 Python
Python中endswith()函数的基本使用
Apr 07 Python
Python中的变量和作用域详解
Jul 13 Python
深入理解Python中变量赋值的问题
Jan 12 Python
Python+matplotlib实现填充螺旋实例
Jan 15 Python
Matplotlib 生成不同大小的subplots实例
May 25 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
python解释器spython使用及原理解析
Aug 24 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
Mac中PyCharm配置Anaconda环境的方法
Mar 04 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
PyTorch中Tensor的数据类型和运算的使用
Sep 03 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添加Xdebug扩展的方法
2014/02/12 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
8个PHP数组面试题
2015/06/23 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
2018/06/10 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
循环 vs 递归浅谈
2013/02/28 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
Python找出9个连续的空闲端口
2016/02/01 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
python 列表降维的实例讲解
2018/06/28 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
python kafka 多线程消费者&手动提交实例
2019/12/21 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
小学后勤管理制度
2014/01/14 职场文书
实习报告评语
2014/04/26 职场文书
五一劳动节慰问信
2015/02/14 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
MySQL系列之二 多实例配置
2021/07/02 MySQL
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技