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 基础学习教程
Feb 08 Python
python使用pil生成缩略图的方法
Mar 26 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
python面向对象入门教程之从代码复用开始(一)
Dec 11 Python
Python编程深度学习绘图库之matplotlib
Dec 28 Python
使用python画社交网络图实例代码
Jul 10 Python
Python 等分切分数据及规则命名的实例代码
Aug 16 Python
Python datetime包函数简单介绍
Aug 28 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
简述python四种分词工具,盘点哪个更好用?
Apr 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
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
基于wordpress的ajax写法详解
2018/01/02 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
Python socket实现简单聊天室
2018/04/01 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
python3实现表白神器
2019/04/09 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
小学生安全保证书
2014/02/01 职场文书
学校门卫岗位职责
2014/03/16 职场文书
合作协议书范本
2014/04/17 职场文书
党员志愿者活动方案
2014/08/28 职场文书
出国留学单位推荐信
2015/03/26 职场文书
义卖募捐活动总结
2015/05/09 职场文书
物业公司管理制度
2015/08/05 职场文书
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle