Scrapy 框架(三)之Item Pipeline

Item Pipeline

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。

每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃还是存储。以下是Item Pipeline的一些典型应用:

  • 验证爬取的数据(检查item包含某些字段,比如说name字段)
  • 查重(并丢弃)
  • 将爬取结果保存到文件或者数据库中
  • 清理HTML数据

编写Item Pipeline

编写item pipeline很简单,item pipiline组件是一个独立的Python类,其中process_item()方法必须实现,另外还有几个比较实用的方法:open_spider()、close_spider()、from_crawler()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class SomethingPipeline(object):
def __init__(self):
# 可选实现,做参数初始化等

@classmethod
def from_crawler(cls, crawler):
return cls()

def process_item(self, item, spider):
# item (Item 对象) – 被爬取的item
# spider (Spider 对象) – 爬取该item的spider
# 这个方法必须实现,每个item pipeline组件都需要调用该方法,
# 这个方法必须返回一个 Item 对象,被丢弃的item将不会被之后的pipeline组件所处理。
return item

def open_spider(self, spider):
# spider (Spider 对象) – 被开启的spider
# 可选实现,当spider被开启时,这个方法被调用。

def close_spider(self, spider):
# spider (Spider 对象) – 被关闭的spider
# 可选实现,当spider被关闭时,这个方法被调用
  • process_item(self, item, spider):是必须要实现的方法,被定义的 Item Pipeline 会默认调用这个方法对 Item 进行处理。比如,我们可以进行数据处理或者将数据写入到数据库等操作。它必须返回 Item 类型的值或者抛出一个 DropItem 异常。

    • item:是 Item 对象,即被处理的 Item。
    • spider:是Spider对象,即生成该Item的Spider。

    如果它返回的是Item对象,那么此Item会被低优先级的Item Pipeline的process_item()方法处理,直到所有的方法被调用完毕。

    如果它抛出的是DropItem异常,那么此Item会被丢弃,不再进行处理。

  • open_spider(self, spider):open_spider()方法是在Spider开启的时候被自动调用的,在这里我们可以做一些初始化操作,如开启数据库连接等。

    • spider:是被开启的Spider对象。
  • close_spider(self, spider):close_spider()方法是在Spider关闭的时候自动调用的,在这里我们可以做一些收尾工作,比如关闭数据库连接等。

    • spider:是被关闭的Spider对象。
  • from_crawler(cls, crawler):from_crawler()方法是一个类方法,用@classmethod标识,是一种依赖注入的方式。

    • cls:就是Class,返回一个Class实例。
    • crawler:通过crawler对象,我们可以拿到Scrapy的所有核心组件,如全局配置的每个信息,然后创建一个Pipeline实例。

启用一个Item Pipeline组件

为了启用Item Pipeline组件,必须将它的类添加到 settings.py文件ITEM_PIPELINES 配置,就像下面这个例子:

1
2
3
4
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
'mySpider.pipelines.MyspiderPipeline': 300,
#}

分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内(0-1000随意设置,数值越低,组件的优先级越高)

-------------本文结束感谢您的阅读-------------

本文标题:Scrapy 框架(三)之Item Pipeline

文章作者:GavinLiu

发布时间:2018年05月05日 - 09:05

最后更新:2018年05月07日 - 15:05

原始链接:http://gavinliu4011.github.io/post/ae0bd4cd.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

请博主吃个鸡腿吧
0%