如何用item pipeline(管道)清洗数据
管道是什么
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(管道)清洗数据相关推荐
- scrapy使用item,pipeline爬取数据,并且上传图片到oss
Scrapy原理图 首先是要理解scrapy的运作原理是什么.这里不做解释,网上有很多资源可以理解. 声明item对象 明确了需要爬取哪些字段,就现在items.py里面定义字段 import scr ...
- 玩转 Scrapy 框架 (一):Item Pipeline 的使用
目录 一.核心方法 二.实战:获取图片(仅学习使用) 2.1 简单分析 2.2 编码 三.总结 Item Pipeline 即项目管道,调用发生在 Spider 产生 Item 之后,当 Spider ...
- python删除excel第一行_如何用 Python 清洗数据?
林骥的第 38 篇文章 0. 序言在做数据分析之前,我们首先要明确数据分析的目标,然后应用数据分析的思维,对目标进行细分,再采取相应的行动.我们可以把数据分析细分为以下 8 个步骤:(1)读取(2)清 ...
- scrapy爬虫之item pipeline保存数据
##简介 前面的博文我们都是使用"-o ***.josn"参数将提取的item数据输出到json文件,若不加此参数提取到的数据则不会输出.其实当Item在Spider中被收集之后, ...
- mysql数据清洗_如何用Mysql清洗数据
在数据分析中从获取数据到最后的完成数据分析报告,你要是问一个从事数据分析的人哪里最麻烦最费时间,十个里面有九个会回答你:清洗数据. 在清洗数据流程中,绝大多数分析师都会使用Python和R来处理,那如 ...
- 第45讲:哪都能存,Item Pipeline 的用法
在前面的示例中我们已经了解了 Item Pipeline 项目管道的基本概念,本节课我们就深入详细讲解它的用法. 首先我们看看 Item Pipeline 在 Scrapy 中的架构,如图所示. 图中 ...
- python pipeline框架_爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ 1. Spider Middleware Spider Middleware是介入到Scrapy的Spid ...
- 如何用python爬取网页数据,python爬取网页详细教程
大家好,本文将围绕python怎么爬取网站所有网页展开说明,如何用python爬取网页数据是一个很多人都想弄明白的事情,想搞清楚python如何爬取网页数据需要先了解以下几个事情. 1.如何用Pyth ...
- GPU上创建目标检测Pipeline管道
GPU上创建目标检测Pipeline管道 Creating an Object Detection Pipeline for GPUs 今年3月早些时候,展示了retinanet示例,这是一个开源示例 ...
最新文章
- python 引用传递和值传递(实参,形参)
- 常考数据结构与算法:进制转换
- 神经网络中常用的激活函数
- 面试官 | 什么是递归算法?它有什么用?
- 关于用户自定义控件与引用该控件的页面之间的javascript脚本冲突
- CAP原理和最终一致性(Eventually Consistency)
- Python3的os.popen()与subprocess使用(关于数据处理)
- 【Matlab学习笔记】【函数学习】一(延时函数pause)
- chrome android版 插件下载,谷歌chrome安卓版
- Difference between UDP and TCP
- 计算机键盘上除在哪里,backspace键在哪里
- Java 断点续传以及在线视频播放可选择任一时间播放原理
- 黑色幽默(Black humor)
- 用手机写一个抓cookie软件
- (基础准备)多元相关与回归分析——一元线性相关与回归分析(一) python+numpy库 实现
- ubuntu系统(二):ibus拼音将繁体中文改为简体中文
- 【springboot错误】 Failed to instantiate [org.springframework.transaction.interceptor.BeanFactoryTransac
- TerraMaster TOS 远程命令执行(CVE-2022-24989)TerraMaster TOS 敏感信息泄露(CVE-2022-24990)
- 搞懂事件循环,面试不再害怕console输出问题。(自整)
- XPLANE,世界级的“Visual Thinking”Company
热门文章
- LSMW批处理使用方法(03)_步骤2
- SAP固定资产期初导入检查
- 计划策略-10-净需求计划
- SAP各种凭证的取消小结
- 察看ABAP程序各项参数限制的情况
- 乡村要振兴,快递先进村?
- 深圳“拍了拍”长沙:美食巨头文和友、茶颜、徐记海鲜正在“排队”签收
- springboot 替换tomcat_Spring Boot实战 之 解剖HelloWorld原型应用
- 联通4g满格但是网速慢_手机信号明明满格?网速却非常慢,原来其中讲究这么大,涨知识了...
- ajax html xml数据格式,AJAX | 数据格式JSON与XML的区别