scrapy爬虫系列:数据结构体item及数据处理逻辑pipline
发布于 作者:苏南大叔 来源:程序如此灵动~pipline
是scrapy
系列处理数据的地方,在pipline
里面,可以把采集到的数据持久化。而scrapy
就是item
就是数据的标准格式,有点像以前c#时代的model
,定义数据属性的地方。那么,通常意义上的,抓取到的数据要经过item
格式化,然后到pipline
里面持久化。
在本文中,苏南大叔就简要的描述一下,在scrapy
中,如何理解pipline
和item
,以及如何根据处理数据的基本流程。
定义item
从scrapy
的项目结构上看,所有的爬虫都是共用一个items.py
定义文件的。items.py
和spiders/*
的对应关系是一对多的关系。所以,个人认为,这可能会有些逻辑上的混乱。或者大家不同功用的爬虫就不要放到一个项目里面吧。
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
之中进行处理。
抓取数据生成item
定义好的item
结构,如果想要在spiders/*
里面使用,还是需要先引用一下才能识别的。识别之后,通过数据分析填充,生成好一个item
之后,就yield <item>
。进入到下一个流程pieline
之中。
如下代码假设:项目名叫demo
,定义的item
叫ArticleItem
。那么在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.py
的ITEM_PIPELINES
项目内容如下:
ITEM_PIPELINES = {
'demo.pipelines.DemoPipeline': 300,
}
其中的数字300
,就是用于调整pipline
中的优先级别使用的。既然只有一个pipline
,那么大家也就不用究竟到底优先级是怎么回事了。
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()
的过程,你懂的。
如果想知道更多的数据处理方式,请关注苏南大叔的后续文章。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。