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环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
python学习之面向对象【入门初级篇】
Jan 21 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
Flask之flask-session的具体使用
Jul 26 Python
Pycharm取消py脚本中SQL识别的方法
Nov 29 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
Python 3 判断2个字典相同
Aug 06 Python
Python (Win)readline和tab补全的安装方法
Aug 27 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 04 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
php实现文件编码批量转换
2014/03/10 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
PHP浮点比较大小的方法
2016/02/14 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
2018/05/30 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
python使用range函数计算一组数和的方法
2015/05/07 Python
python如何为创建大量实例节省内存
2018/03/20 Python
Python 求数组局部最大值的实例
2019/11/26 Python
Python函数式编程实例详解
2020/01/17 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
酒店总经理工作职责
2013/12/13 职场文书
cf战队收人广告词
2014/03/14 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技