我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

piplinescrapy系列处理数据的地方,在pipline里面,可以把采集到的数据持久化。而scrapy就是item就是数据的标准格式,有点像以前c#时代的model,定义数据属性的地方。那么,通常意义上的,抓取到的数据要经过item格式化,然后到pipline里面持久化。

在本文中,苏南大叔就简要的描述一下,在scrapy中,如何理解piplineitem,以及如何根据处理数据的基本流程。

苏南大叔:scrapy爬虫系列:数据结构体item及数据处理逻辑pipline - item_pipline
scrapy爬虫系列:数据结构体item及数据处理逻辑pipline(图3-1)

定义item

scrapy的项目结构上看,所有的爬虫都是共用一个items.py定义文件的。items.pyspiders/*的对应关系是一对多的关系。所以,个人认为,这可能会有些逻辑上的混乱。或者大家不同功用的爬虫就不要放到一个项目里面吧。

item的定义非常容易,一个数据结构就是一个class,字段不分具体的类型(比如数字型/字符串型),都是一个定义方式scrapy.Field()

下面是个典型的文章类型的定义代码。

import scrapy
class ArticleItem(scrapy.Item):
    title = scrapy.Field()
    content = scrapy.Field()
    href = scrapy.Field()
    pass

使用的时候,流程是这样的:
一般是在spiders/*里面,抓取数据生成item,然后yield <item>pipline之中进行处理。

苏南大叔:scrapy爬虫系列:数据结构体item及数据处理逻辑pipline - item_define
scrapy爬虫系列:数据结构体item及数据处理逻辑pipline(图3-2)

抓取数据生成item

定义好的item结构,如果想要在spiders/*里面使用,还是需要先引用一下才能识别的。识别之后,通过数据分析填充,生成好一个item之后,就yield <item>。进入到下一个流程pieline之中。

如下代码假设:项目名叫demo,定义的itemArticleItem。那么在spiders/*中引用的方式就是:

from demo.items import ArticleItem
如果大家不知道项目的name,可以到settings.py里面查找BOT_NAME就可以知道了。

spiders/*的数据抓取代码中,返回一个整理好的item的方法就是:

def parse(self, response):
    # ...
    item = ArticleItem()
    # text = post.css("header h2 a::text").extract_first()
    # href =  post.css("header h2 a::attr('href')").extract_first()
    item["title"] = text
    item["href"] = href
    # ...
    yield item

这里的yield有些不太好理解,大家可以暂时理解为一个异步版的return就好了。

setting里面开启pipline

yield item之后,就到了pipline里面进行处理了。但是,pipline需要注册并且启用之后,才能使用。而且pipline可以注册很多个,每个pipline之间存在着现后逻辑关系,都可以处理item,处理完之后提交到下一个pipline里面。

苏南大叔需要编辑一下setting.py找到ITEM_PIPELINES项目,编辑里面的内容即可。这些pipline,目前都是定义在piplines.py里面,一个pipline就是piplines.py中的一个class。这些pipline相互影响,有优先级的现后顺序。

当然,作为教程文章,苏南大叔还是仅仅考虑最简单的情况,在项目demo中的piplines.py中,仅仅定义了一个DemoPipeline类的情况。

setting.pyITEM_PIPELINES项目内容如下:

ITEM_PIPELINES = {
   'demo.pipelines.DemoPipeline': 300,
}

其中的数字300,就是用于调整pipline中的优先级别使用的。既然只有一个pipline,那么大家也就不用究竟到底优先级是怎么回事了。

苏南大叔:scrapy爬虫系列:数据结构体item及数据处理逻辑pipline - setting
scrapy爬虫系列:数据结构体item及数据处理逻辑pipline(图3-3)

pipline处理item

好,终于到了最终的在pipline里面处理item的环节了。套路也挺简单的。

class DemoPipeline(object):
    def __init__(self):
        # ...
        # ...
    def process_item(self, item, spider):
        # ...
        # ...
        return item

注意看最后的return item,这个item将会提交到下一个pipline里面进行处理。

基本的套路是:__init__()process_item(),当然还可以监控open_spider()open_spider()。不过,对于基础应用也是用不到的。那么,本篇文章这里也不做讨论。

大多数情况下,对数据的持久化动作,就是发生在process_item()函数里面了。大家的主要战场也就是这个函数,加油!

相关链接

如果您的好奇心比较严重,可以点击下面这条链接,查看更多的官方说明。

总结

具体如何处理item,途径有很多,比如:发送到kafka,发送到redis,或者存储到mysql,这些都是比较常见的使用场景。

在本文中,并不涉及具体的持久化代码。如何持久化数据,就是使用不同的python代码,套用填充__init__()process_item()的过程,你懂的。

如果想知道更多的数据处理方式,请关注苏南大叔的后续文章。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    scrapy