精通Scrapy网络爬虫【五】使用Item Pipeline处理数据

使用Item Pipeline处理数据

在Scrapy中,Item Pipeline是处理数据的组件,一个Item Pipeline就是一个包含特定接口的类,通常只负责一种功能的数据处理,在一个项目中可以同时启用多个ItemPipeline,它们按指定次序级联起来,形成一条数据处理流水线。

在创建一个Scrapy项目时,会自动生成一个pipelines.py文件,它用来放置用户自定义的Item Pipeline,在example项目的pipelines.py中实现PriceConverterPipeline,代码如下
功能:将爬取到的价格转换成人民币

class PriceConverterPipeline(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不需要继承特定基类,只需要实现某些特定方法,例如process_item、open_spider、close_spider。

一个Item Pipeline必须实现一个process_item(item, spider)方法,该方法用来处理每一项由Spider爬取到的数据,其中的两个参数:
** Item**爬取到的一项数据(Item或字典)。
Spider爬取此项数据的Spider对象。

除了必须实现的process_item方法外,还有3个比较常用的方法,可根据需求选择实现:

open_spider(self, spider)
Spider打开时(处理数据前)回调该方法,通常该方法用于在开始处理数据之前完成某些初始化工作,如连接数据库。

close_spider(self, spider)
Spider关闭时(处理数据后)回调该方法,通常该方法用于在处理完所有数据之后完成某些清理工作,如关闭数据库。

from_crawler(cls, crawler)
创建Item Pipeline对象时回调该类方法。通常,在该方法中通过crawler.settings读取配置,根据配置创建Item Pipeline对象。

启用Item Pipeline

在Scrapy中,Item Pipeline是可选的组件,想要启用某个(或某些)ItemPipeline,需要在配置文件settings.py中进行配置:

ITEM_PIPELINES={
    'book.pipelines.PriceConverterPipeline':300,
}

注意book改为自己的项目名称

ITEM_PIPELINES是一个字典,我们把想要启用的Item Pipeline添加到这个字典中,其中每一项的键是每一个Item Pipeline类的导入路径,值是一个0~1000的数字,同时启用多个Item Pipeline时,Scrapy根据这些数值决定各Item Pipeline处理数据的先后次序,数值小的在前。

启用PriceConverterPipeline后,重新运行爬虫,并观察结果:
在这里插入图片描述书价转换成了人民币价格。

过滤重复数据

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

增加构造器方法,在其中初始化用于对书名去重的集合。

在process_item方法中,先取出item的name字段,检查书名是否已在集合book_set中,如果存在,就是重复数据,抛出DropItem异常,将item抛弃;否则,将item的name字段存入集合,返回item。

接下来测试DuplicatesPipeline。首先在不启用DuplicatesPipeline的情况下,运行爬虫,
在这里插入图片描述
此时有1000本书。
然后在配置文件settings.py中启用DuplicatesPipeline:

ITEM_PIPELINES={
    'book.pipelines.PriceConverterPipeline':300,
    'book.pipelines.DuplicatesPipeline':350,
}

运行:
在这里插入图片描述
只有999本了,比之前少了1本,说明有两本书是同名的

参考资料:《精通Scrapy网络爬虫》刘硕 清华大学出版社

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小旺不正经

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值