(4)Scrapy的Item Pipeline(项目管道)

本文介绍了Scrapy的项目管道(ItemPipeline)功能,用于处理和过滤蜘蛛(spider)抓取的项目(item)。示例包括清理HTML、验证数据、去除重复项以及将数据存储到MongoDB。激活项目管道需要在设置中配置,并按顺序执行。
摘要由CSDN通过智能技术生成

1.Item Pipeline(项目管道)

蜘蛛(spider)抓取数据后,通过项目(Item)发送到项目管道(Item Pipeline)中,该管道通过几个按顺序执行的组件来处理它。
每个项目管道组件(有时仅称为“项目管道”)是一个实现简单方法的Python类。他们收到一个项目并对其执行操作,还决定该项目是否应该继续通过管道或被丢弃并且不再处理。项目管道的典型用途是:
●清理HTML数据。
●验证抓取的数据(检查项目是否包含某些字段)。
●检查重复项(并删除它们)。
●将抓取的项目存储在数据库中。

2.编写自己的项目管道

每个项目管道组件都是一个Python类,必须实现以下方法:
(1)process_item(self, item, spider)
●item:是一个项目对象(item),详情请查看上一篇文章。
●process_item():返回一个项目对象(item)或者一个Deferred或引发一个DropItem异常。丢弃的项目(item)不再由其他管道组件处理。
●参数
item(项目对象):被抓取的项目(item)。
spider(蜘蛛对象):抓取数据的蜘蛛(spider)。
此外,他们还可以实现以下方法:
(2)open_spider(self, spider)
打开spider(蜘蛛对象)时调用此方法。
●参数
spider(蜘蛛对象):打开spider对象。
(3)close_spider(self, spider)
关闭spider(蜘蛛)时调用此方法。
●参数
spider(蜘蛛对象):关闭spider对象。
(4)from_crawler(cls, crawler)
如果存在该爬虫对象,则调用此类方法取它返回管道的新实例。爬虫对象提供对所有Scrapy 核心组件的访问,例如设置和信号。这是管道访问它们并将其功能挂钩到Scrapy的一种方式。
●参数
crawler(爬虫对象):使用此管道的爬虫。

2.1项目管道示例

●过滤项目(item)新闻热点指数
还是百度新闻热点例子,过滤新闻热点指数为空的数据,如果不为空就累加1,否则就丢弃该项目:

from itemadapter import ItemAdapter
from scrapy.exceptions import DropItem

class ScrapyDengSamplePipeline:
    def process_item(self, item, spider):
        adapter = ItemAdapter(item)
        if adapter.get("Title"):
            adapter["HotSearchIndex"] = adapter["HotSearchIndex"] + 1
        else:    
            raise DropItem(f"Missing Title in {item}")
        return item

如下图所示:

●将项目(item)写入MongoDB
这个例子的主要目的是展示如何使用from_crawler()方法以及如何正确清理资源:

import pymongo
from itemadapter import ItemAdapter

class MongoPipeline:

    collection_name = 'scrapy_items'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].insert_one(ItemAdapter(item).asdict())
        return item

除了上述这两个例子,其实还有很多作用,比如将项目写入JSON文件、截取项目截图、重复过滤器等等,具体代码大伙可以到我下面提供链接地址到官网看看示例,这里就不多陈述了。

2.2激活项目管道组件

要激活项目管道(Item Pipeline)组件,您必须将每个项目管道类添加到ITEM_PIPELINES设置中,如下例所示:

ITEM_PIPELINES = {
    'myproject.pipelines.ScrapyDengSamplePipeline': 300,
    'myproject.pipelines.MongoPipeline': 800,
}

在该设置中配置每个项目管道类的值决定了它们运行的顺序:项目从低值到高值的类,通常将这些数字定义在0-1000范围内。

参考文献:
Scrapy项目管道https://docs.scrapy.org/en/latest/topics/item-pipeline.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值