版权声明:本文为博主原创文章,转载请注明出处;如果博客中有错误之处抑或有可以改进的地方,欢迎在评论区留言。 https://blog.csdn.net/f156207495/article/details/81428011
管道是什么
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.5309

def process_item(self , item , spider):
price = float(item['price'][1:]) * self.exchange_rate
item['price'] = '¥ %.2f' % price
return 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 item
collection.insert_one(post)
return item

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
python爬虫 第6天 数据清洗 自然语言处理 128页
数据清洗编写代码清洗数据数据存储后再清洗strip() 方法用于移除字符串头尾指定的字符(默认为空格)。 string.punctuation 来获取 Python 所有的标点符自然语言处理马尔可夫模...
---------------------
作者:chen_you_Nick
来源:CSDN
原文:https://blog.csdn.net/f156207495/article/details/81428011
版权声明:本文为博主原创文章,转载请附上博文链接!

如何用item pipeline(管道)清洗数据的更多相关文章

  1. 使用item pipeline处理保存数据

    一个Item Pipeline 不需要继承特定基类,只需要实现某些特定方法,面向接口. class MyPipeline(object): def __init__(self): "&quo ...

  2. Python高级编程之生成器(Generator)与coroutine(三):coroutine与pipeline(管道)和Dataflow(数据流_

    原创作品,转载请注明出处:点我 在前两篇文章中,我们介绍了什么是Generator和coroutine,在这一篇文章中,我们会介绍coroutine在模拟pipeline(管道 )和控制Dataflo ...

  3. scrapy框架之Pipeline管道类

    Item Pipeline简介 Item管道的主要责任是负责处理有蜘蛛从网页中抽取的Item,他的主要任务是清洗.验证和存储数据.当页面被蜘蛛解析后,将被发送到Item管道,并经过几个特定的次序处理数 ...

  4. Scrapy爬虫框架第七讲【ITEM PIPELINE用法】

    ITEM PIPELINE用法详解:  ITEM PIPELINE作用: 清理HTML数据 验证爬取的数据(检查item包含某些字段) 去重(并丢弃)[预防数据去重,真正去重是在url,即请求阶段做] ...

  5. laravel5.5源码笔记(五、Pipeline管道模式)

    Pipeline管道模式,也有人叫它装饰模式.应该说管道是装饰模式的一个变种,虽然思想都是一样的,但这个是闭包的版本,实现方式与传统装饰模式也不太一样.在laravel的源码中算是一个比较核心的设计模 ...

  6. scrapy框架中Item Pipeline用法

    scrapy框架中item pipeline用法 当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的pyt ...

  7. Scrapy进阶知识点总结(四)——Item Pipeline

    Item Pipeline Item Pipeline调用发生在Spider产生Item之后.当Spider解析完Response之后,Item就会传递到Item Pipeline,被定义的Item ...

  8. 小白学 Python 爬虫(38):爬虫框架 Scrapy 入门基础(六) Item Pipeline

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  9. 爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline

    1. Spider Middleware Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架. 当Downloader生成Response之后,Response会被 ...

随机推荐

  1. 货郎担问题(TSP问题)

    货郎担问题也叫旅行商问题,即TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一. 有n个城市,用1,2,…,n表示,城i,j之间的距离为dij,有一个货郎从城 ...

  2. CentOS6.5卸载自带的Mysql软件

    现想要在这家的服务器上安装Mysql集群,发现之前安装操作系统的时候顺便把MySql默认安装,所以需要将它先卸载掉. 1,查找已安装的mysql版本 [root@leader ~]# rpm -qa| ...

  3. C++入门经典-例3.24-找图书的位置

    1:运行代码: // 3.24.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...

  4. linux如何查看所有的用户和组信息(转载)

    [步骤一]cat /etc/passwdcat /etc/passwd查看所有的用户信息,详情如下图 [步骤二]cat /etc/passwd|grep 用户名 cat /etc/passwd|gre ...

  5. LeetCode 96. 不同的二叉搜索树(Unique Binary Search Trees )

    题目描述 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 输出: 解释: 给定 n = , 一共有 种不同结构的二叉搜索树: \ / / / \ \ / / ...

  6. java基本类型对齐

    1.Java 基本数据类型和精度 整数数据类型 关键字 描述 大小 格式 byte 字节长度整数 8 位二进制补码 从 +127 到 -128 short 短整型 16 位二进制补码 从 +32767 ...

  7. iso-----genisoimage/md5sum命令用法

    命令安装 直接yum安装即可 yum install genisoimage -y 功能说明 可将指定的目录与文件做成ISO 9660格式的映像文件,以供刻录光盘 语法 genisoimage -U ...

  8. ERROR:非静态成员引用必须与特定对象相对

    非静态成员引用必须与特定对象相对 引用非静态成员前应该先声明该类的对象 typedef struct _SUPERRESOLUTIONPARAM { int Times; //重建倍数,指的是分别对长 ...

  9. 手动清空微信PC客户端数据

    微信PC客户端,用久了之后,会产生大量数据,包括聊天记录.聊天图片.视频等等,非常占存储空间,除非很重要的聊天记录或文件,建议额外保存,其他的可以手动删掉就好,可以节省存储空间. 1.找到[C:\Us ...

  10. flutter tabbar创建与显示

    效果图 main.dart import 'package:flutter/material.dart'; import 'pages/index_page.dart'; void main() =& ...