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 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
Python Django使用forms来实现评论功能
Aug 17 Python
python实现斐波那契数列的方法示例
Jan 12 Python
Python 类的特殊成员解析
Jun 20 Python
python实践项目之监控当前联网状态详情
May 23 Python
python经典趣味24点游戏程序设计
Jul 26 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
pytorch 预训练层的使用方法
Aug 20 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Numpy中ndim、shape、dtype、astype的用法详解
Jun 14 Python
在keras中实现查看其训练loss值
Jun 16 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 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
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
jQuery操作iframe中js函数的方法小结
2016/07/06 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
Python字符串拼接的几种方法整理
2017/08/02 Python
python如何对实例属性进行类型检查
2018/03/20 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
python下载库的步骤方法
2019/10/12 Python
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
护理职业生涯规划书
2014/01/24 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
中文专业自荐书
2014/06/29 职场文书
企业读书活动总结
2014/06/30 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
小学主题班会教案
2015/08/17 职场文书
超市主管竞聘书
2015/09/15 职场文书
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL