zoukankan      html  css  js  c++  java
  • 如何用item pipeline(管道)清洗数据

    版权声明:本文为博主原创文章,转载请注明出处;如果博客中有错误之处抑或有可以改进的地方,欢迎在评论区留言。 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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    字符串系列复习
    点分治总结
    LCT总结
    网络流总结
    centOS7下安装GUI图形界面
    周记 2014.10.8
    周记 2014.9.28
    周记 2014.9.20
    tar命令
    [转]bit与byte
  • 原文地址:https://www.cnblogs.com/lixiaosong914/p/9836404.html
Copyright © 2011-2022 走看看