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检测网页是否有日常链接
Jun 03 Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
Python聊天室实例程序分享
Jan 05 Python
Python的Twisted框架上手前所必须了解的异步编程思想
May 25 Python
python框架中flask知识点总结
Aug 17 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
python numpy 矩阵堆叠实例
Jan 17 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
Python unittest基本使用方法代码实例
Jun 29 Python
python pymysql库的常用操作
Oct 16 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 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 SEO优化之URL优化方法
2011/04/21 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
php中opendir函数用法实例
2014/11/15 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
php文件上传类的分享
2017/07/06 PHP
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python struct模块解析
2014/06/12 Python
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Python多进程同步简单实现代码
2016/04/27 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
高校教师岗位职责
2014/03/18 职场文书
项目合作意向书范本
2014/04/01 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
归元寺导游词
2015/02/06 职场文书
无工作证明怎么写
2015/06/15 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
婚礼家长致辞
2015/07/27 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers