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中MYSQLdb出现乱码的解决方法
Oct 11 Python
Python中Iterator迭代器的使用杂谈
Jun 20 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
使用python-Jenkins批量创建及修改jobs操作
May 12 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
基于logstash实现日志文件同步elasticsearch
Aug 06 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Oct 16 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
实用函数7
2007/11/08 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
妇女工作先进事迹
2014/08/17 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
优秀教师个人材料
2014/12/15 职场文书
水电工岗位职责
2015/02/14 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android