管道是什么

Item管道(Item Pipeline):

  • 主要负责处理有蜘蛛从网页中抽取的Item,主要任务是清洗、验证和存储数据。
  • 当页面被蜘蛛解析后,将被发送到Item管道,并经过几个特定的次序处理数据。
  • 每个Item管道的组件都是有一个简单的方法组成的Python类。
  • 它们获取了Item并执行它们的方法,同时还需要确定是否需要在Item管道中继续执行下一步或是直接丢弃掉不处理。
  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

管道的作用

  • 清理HTML数据
  • 验证抓取的数据(检查项目是否包含特定字段)
  • 检查重复(并删除)
    考虑到性能的原因,去重最好在链接中去重,或者利用数据库主键的唯一性去重
  • 将刮取的项目存储在数据库中

接着上文《如何使用scrapy的item来封装数据》,我现在需要实现额外的三个处理——将价格的单位英镑转换为人民币、去除掉书名相同的重复数据、将数据存入MongoDB中。

如何实现Item Pipeline

一个Item Pipeline不需要继承特定基类,只需要实现某些特定方法,如process_item、open_spider、close_spider等。

process_item(item , spider):

每个 Item Pipeline 组件都需要调用该方法,这个方法必须返回一个 Item (或任何继承类)对象, 或是抛出 DropItem 异常,被丢弃的 item 将不会被之后的 pipeline 组件所处理

需要传入的参数为:

  • item (Item 对象) : 被爬取的 item
  • spider (Spider 对象) : 爬取该 item 的 spider

    该方法会被每一个 item pipeline 组件所调用,process_item 必须返回以下其中的任意一个对象:

  • 一个 dict

  • 一个 Item 对象或者它的子类对象
  • 一个 Twisted Deferred 对象
  • 一个 DropItem exception;如果返回此异常,则该 item 将不会被后续的 item pipeline 所继续访问

    注意:该方法是Item Pipeline必须实现的方法,其它三个方法(open_spider/close_spider/from_crawler)是可选的方法

如果process_item返回了一项数据(item或字典),返回的数据会传递给下一级Item Pipeline继续处理,如果没有则结束处理。
另外,当process_item在处理某项item时抛出DropItem异常,该项item便会被抛弃,不再传递给后面的Item Pipeline处理,也不会导出到文件。

open_spider(self , spider ):——爬虫启动时调用

Spider打开时,即处理数据前,会回调该方法。该方法通常用于在开始处理数据前完成一些初始化工作,比如连接数据库。

close_spider(self , spider):——爬虫关闭时调用

与open_spider相对,为Spider关闭时,即处理数据后,会回调该方法。该方法通常用于在处理完所有数据之后完成某些清理工作,比如关闭数据库。

from_crawler(cls, crawler):——也是在爬虫启动时调用,但是比open_spider早

创建Item Pipeline对象时回调该类方法。该类方法用来从 Crawler 中初始化得到一个 pipeline 实例;它必须返回一个新的 pipeline 实例;Crawler 对象提供了访问所有 Scrapy 核心组件的接口,包括 settings 和 signals

代码实现

新建bookpipelines.py文件

from scrapy.exceptions import DropItem
from scrapy.item import Item
import pymongo#实现价格转换——第一个Item Pipeline,执行顺序较次
class PricePipeline(object):exchange_rate = 8.5309def process_item(self , item , spider):price = float(item['price'][1:]) * self.exchange_rateitem['price'] = '¥ %.2f' % pricereturn item# 实现去除重复书名的数据——第二个Item Pipeline,执行顺序最优
class DuplicatesPipeline(object):def __init__(self):self.book_set = set()def process_item(self , item , spider):name = item['name']if name in self.book_set:raise DropItem("Duplicate book found: %s" % item)self.book_set.add(name)return item#实现将数据存入mongoDB中——第三个Item Pipeline,执行顺序最后
class MongoDBPipeline(object):def from_crawler(cls , crawler):cls.DB_URI = crawler.settings.get('MONGO_DB_URI' , 'mongodb://localhost:27017/')cls.DB_NAME = crawler.settings.get('MONGO_DB_NAME' , 'scrapy_datas')return cls()def open_spider(self , spider):self.client = pymongo.MongoClient(self.DB_URI)self.db = self.client[self.DB_NAME]def close_spider(self , spider):self.client.close()def process_item(self , item , spider):collection = self.db[spider.name]post = dict(item) if isinstance(item , Item) else itemcollection.insert_one(post)return item

如何用item pipeline(管道)清洗数据相关推荐

  1. scrapy使用item,pipeline爬取数据,并且上传图片到oss

    Scrapy原理图 首先是要理解scrapy的运作原理是什么.这里不做解释,网上有很多资源可以理解. 声明item对象 明确了需要爬取哪些字段,就现在items.py里面定义字段 import scr ...

  2. 玩转 Scrapy 框架 (一):Item Pipeline 的使用

    目录 一.核心方法 二.实战:获取图片(仅学习使用) 2.1 简单分析 2.2 编码 三.总结 Item Pipeline 即项目管道,调用发生在 Spider 产生 Item 之后,当 Spider ...

  3. python删除excel第一行_如何用 Python 清洗数据?

    林骥的第 38 篇文章 0. 序言在做数据分析之前,我们首先要明确数据分析的目标,然后应用数据分析的思维,对目标进行细分,再采取相应的行动.我们可以把数据分析细分为以下 8 个步骤:(1)读取(2)清 ...

  4. scrapy爬虫之item pipeline保存数据

    ##简介 前面的博文我们都是使用"-o ***.josn"参数将提取的item数据输出到json文件,若不加此参数提取到的数据则不会输出.其实当Item在Spider中被收集之后, ...

  5. mysql数据清洗_如何用Mysql清洗数据

    在数据分析中从获取数据到最后的完成数据分析报告,你要是问一个从事数据分析的人哪里最麻烦最费时间,十个里面有九个会回答你:清洗数据. 在清洗数据流程中,绝大多数分析师都会使用Python和R来处理,那如 ...

  6. 第45讲:哪都能存,Item Pipeline 的用法

    在前面的示例中我们已经了解了 Item Pipeline 项目管道的基本概念,本节课我们就深入详细讲解它的用法. 首先我们看看 Item Pipeline 在 Scrapy 中的架构,如图所示. 图中 ...

  7. python pipeline框架_爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 1. Spider Middleware Spider Middleware是介入到Scrapy的Spid ...

  8. 如何用python爬取网页数据,python爬取网页详细教程

    大家好,本文将围绕python怎么爬取网站所有网页展开说明,如何用python爬取网页数据是一个很多人都想弄明白的事情,想搞清楚python如何爬取网页数据需要先了解以下几个事情. 1.如何用Pyth ...

  9. GPU上创建目标检测Pipeline管道

    GPU上创建目标检测Pipeline管道 Creating an Object Detection Pipeline for GPUs 今年3月早些时候,展示了retinanet示例,这是一个开源示例 ...

最新文章

  1. python 引用传递和值传递(实参,形参)
  2. 常考数据结构与算法:进制转换
  3. 神经网络中常用的激活函数
  4. 面试官 | 什么是递归算法?它有什么用?
  5. 关于用户自定义控件与引用该控件的页面之间的javascript脚本冲突
  6. CAP原理和最终一致性(Eventually Consistency)
  7. Python3的os.popen()与subprocess使用(关于数据处理)
  8. 【Matlab学习笔记】【函数学习】一(延时函数pause)
  9. chrome android版 插件下载,谷歌chrome安卓版
  10. Difference between UDP and TCP
  11. 计算机键盘上除在哪里,backspace键在哪里
  12. Java 断点续传以及在线视频播放可选择任一时间播放原理
  13. 黑色幽默(Black humor)
  14. 用手机写一个抓cookie软件
  15. (基础准备)多元相关与回归分析——一元线性相关与回归分析(一) python+numpy库 实现
  16. ubuntu系统(二):ibus拼音将繁体中文改为简体中文
  17. 【springboot错误】 Failed to instantiate [org.springframework.transaction.interceptor.BeanFactoryTransac
  18. TerraMaster TOS 远程命令执行(CVE-2022-24989)TerraMaster TOS 敏感信息泄露(CVE-2022-24990)
  19. 搞懂事件循环,面试不再害怕console输出问题。(自整)
  20. XPLANE,世界级的“Visual Thinking”Company

热门文章

  1. LSMW批处理使用方法(03)_步骤2
  2. SAP固定资产期初导入检查
  3. 计划策略-10-净需求计划
  4. SAP各种凭证的取消小结
  5. 察看ABAP程序各项参数限制的情况
  6. 乡村要振兴,快递先进村?
  7. 深圳“拍了拍”长沙:美食巨头文和友、茶颜、徐记海鲜正在“排队”签收
  8. springboot 替换tomcat_Spring Boot实战 之 解剖HelloWorld原型应用
  9. 联通4g满格但是网速慢_手机信号明明满格?网速却非常慢,原来其中讲究这么大,涨知识了...
  10. ajax html xml数据格式,AJAX | 数据格式JSON与XML的区别