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异步回调机制实现和使用方法
Nov 26 Python
python如何通过protobuf实现rpc
Mar 06 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
django中模板的html自动转意方法
May 27 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 Python
Python多进程方式抓取基金网站内容的方法分析
Jun 03 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 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
如何开始收听短波广播
2021/03/01 无线电
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
python查询mysql中文乱码问题
2014/11/09 Python
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
Python模块WSGI使用详解
2018/02/02 Python
python 重定向获取真实url的方法
2018/05/11 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
Python和Sublime整合过程图示
2019/12/25 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
python各种excel写入方式的速度对比
2020/11/10 Python
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
阿波罗盒子:Apollo Box
2017/08/14 全球购物
毕业生见习报告总结
2014/11/08 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
python实现剪贴板的操作
2021/07/01 Python
Python作用域和名称空间的详细介绍
2022/04/13 Python