步子百科步子百科

items是什么意思(跟我学系列)

本章工作任务

任务1:为什么要使用Item?

任务2:如何使用Item?

任务3:Item的意思扩展

本章技能目标及重难点编号技能点描述级别1为什么要使用Item?★2如何使用Item?★★★3Item的扩展★★

注: "★"理解级别 "★★"掌握级别 "★★★"应用级别

本章学习目标

本章开始学习Scrapy的Items,需要同学们学会创建Item及相关扩展的跟学Item应用。

本章学习建议

本章适合有Python爬虫基础的系列学员学习。

本章内容(学习活动)

5.1为什么要使用Item?

爬取的意思主要目标就是从非结构性的数据源提取结构性数据,例如网页。跟学Scrapy 提供 Item 类来满足这样的系列需求。

Item 对象是意思种简单的容器,保存了爬取到得数据。跟学其提供了类似于词典(dictionary-like)的系列API以及用于声明可用字段的简单语法。

5.1.1声明 Item

Item 使用简单的意思 class 定义语法以及 Field 对象来声明,如图5-1所示。跟学

5-1 声明Item

熟悉 Django 的系列朋友一定会注意到 Scrapy Item 定义方式与 Django Models 很类似, 不过没有那么多不同的字段类型(Field type),更为简单。意思

5.1.2 Item字段(Item Fields)

Field 对象指明了每个字段的跟学元数据(metadata)。例如下面例子中 last_updated 中指明了该字段的系列序列化函数。

您可以为每个字段指明任何类型的元数据。Field 对象对接受的值没有任何限制。也正是因为这个原因,文档也无法提供所有可用的元数据的键(key)参考列表。Field 对象中保存的每个键可以由多个组件使用,并且只有这些组件知道这个键的存在。您可以根据自己的需求,定义使用其他的 Field 键。 设置 Field 对象的主要目的就是在一个地方定义好所有的元数据。一般来说,那些依赖某个字段的组件肯定使用了特定的键(key)。您必须查看组件相关的文档,查看其用了哪些元数据键(metadata key)。

需要注意的是,用来声明 item 的 Field 对象并没有被赋值为 class 的属性。不过您可以通过 Item.fields 属性进行访问。

以上就是所有您需要知道的如何声明 item 的内容了。

5.2 如何使用Item?

接下来以下边声明的 Product item 来演示一些 item 的操作。您会发现 API 和 dict API 非常相似。

5.2.1 创建 item

如图5-2所示。

5-2创建Item

5.2.2 获取字段的值

get方法可以设置默认值,如此可以避免报错信息的出现。如图5-3所示。

5-3 获取字段值

5.2.3 设置字段的值

当获取一个不存在的属性,会显示错误信息。如图5-4所示。

5-4设置字段值

5.2.4 获取所有获取到的值

您可以使用 dict API 来获取所有的值,即keys(),同时也可以使用items()。如图5-5所示。

5-5 获取所有获取到的值

5.2.5复制 item

可以使用对象方式,也可以使用copy()方法复制item。如图5-6所示。

5-6 复制Item

5.3Item扩展

5.3.1根据 item 创建字典(dict)

使用dict方式创建字典,如图5-7所示。

5-7 根据 item 创建字典(dict)

5.3.2根据字典(dict)创建 item

传入dict来创建Item,如图5-8所示。

5-8 根据字典创建Item

5.3.3扩展 Item

您可以通过继承原始的 Item 来扩展 item(添加更多的字段或者修改某些字段的元数据)。代码如图5-9所示。

5-9 扩展Item

您也可以通过使用原字段的元数据,添加新的值或修改原来的值来扩展字段的元数据,代码如图5-10所示。

5-10 扩展Item

这段代码在保留所有原来的元数据值的情况下添加(或者覆盖)了 name 字段的 serializer。

serializer,表示序列化的意思,可以使用自定义的方法,也可以使用内置的str

5.3.4字段(Field)对象

Field 仅仅是内置的 dict 类的一个别名,并没有提供额外的方法或者属性。换句话说,Field 对象完完全全就是 Python 字典(dict)。被用来基于类属性(class attribute)的方法来支持 item 声明语法。

class scrapy.item.Field([arg])