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实现360的字符显示界面
Feb 21 Python
用python代码做configure文件
Jul 20 Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
浅谈python中的占位符
Nov 09 Python
Django学习笔记之ORM基础教程
Mar 27 Python
利用python如何处理nc数据详解
May 23 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
python实现多层感知器
Jan 18 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 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 网页过期时间的控制代码
2009/06/29 PHP
php设计模式 Strategy(策略模式)
2011/06/26 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
PHP多态代码实例
2015/06/26 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
一些Python中的二维数组的操作方法
2015/05/02 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
医学院学生的自我评价分享
2013/11/19 职场文书
教师师德演讲稿
2014/05/06 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
数学教育专业求职信
2014/07/22 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
Python实现天气查询软件
2021/06/07 Python