爬虫:Scrapy2 - Items

Posted sufei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫:Scrapy2 - Items相关的知识,希望对你有一定的参考价值。

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

声明Item

import scrapy

class Product(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    stock = scrapy.Field()
    last_updated = scrapy.Field(serializer=str)

注:与 Django Models 很类似,不过没有那么多不同的字段类型(Field type)。

Item字段(Item Fields)

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

可以为每个字段指明任何类型的元数据。

创建item

>>> product = Product(name=Desktop PC, price=1000)
>>> print product
Product(name=Desktop PC, price=1000)

获取字段的值

>>> product[name]
Desktop PC
>>> product.get(name)
Desktop PC

>>> product[price]
1000

>>> product[last_updated]
Traceback (most recent call last):
    ...
KeyError: last_updated

>>> product.get(last_updated, not set)
not set

>>> product[lala] # getting unknown field
Traceback (most recent call last):
    ...
KeyError: lala

>>> product.get(lala, unknown field)
unknown field

>>> name in product  # is name field populated?
True

>>> last_updated in product  # is last_updated populated?
False

>>> last_updated in product.fields  # is last_updated a declared field?
True

>>> lala in product.fields  # is lala a declared field?
False

设置字段的值

>>> product[last_updated] = today
>>> product[last_updated]
today

>>> product[lala] = test # setting unknown field
Traceback (most recent call last):
    ...
KeyError: Product does not support field: lala

获取所有获取到的值

>>> product.keys()
[price, name]

>>> product.items()
[(price, 1000), (name, Desktop PC)]

赋值item

>>> product2 = Product(product)
>>> print product2
Product(name=Desktop PC, price=1000)

>>> product3 = product2.copy()
>>> print product3
Product(name=Desktop PC, price=1000)

根据item创建字典(dict)

>>> dict(product) # create a dict from all populated values
{price: 1000, name: Desktop PC}

根据字典(dict)创建item

>>> Product({name: Laptop PC, price: 1500})
Product(price=1500, name=Laptop PC)

>>> Product({name: Laptop PC, lala: 1500}) # warning: unknown field in dict
Traceback (most recent call last):
    ...
KeyError: Product does not support field: lala

扩展Item

可以通过继承原始的 Item 来扩展 item(添加更多的字段或者修改某些字段的元数据)。

class DiscountedProduct(Product):
    discount_percent = scrapy.Field(serializer=str)
    discount_expiration_date = scrapy.Field()

也可以通过使用原字段的元数据,添加新的值或修改原来的值来扩展字段的元数据:

class SpecificProduct(Product):
    name = scrapy.Field(Product.fields[name], serializer=my_serializer)

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

Item对象

class scrapy.item.Item([arg])

返回一个根据给定的参数可选初始化的 item。

Item复制了标准的 dict API。包括初始化函数也相同。Item 唯一额外添加的属性是:

fields

一个包含了 item 所有声明的字段的字典,而不仅仅是获取到的字段。该字典的 key 是字段(field)的名字,值是 Item 声明中使用到的 Field 对象。

字段(Field)对象

class scrapy.item.Field([arg])

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

以上是关于爬虫:Scrapy2 - Items的主要内容,如果未能解决你的问题,请参考以下文章

大数据时代下的Scrapy爬虫框架

scrapy2_初窥Scrapy

爬虫框架scrapy

代码片段 - Golang 实现集合操作

爬虫的基本知识

Python | 初识爬虫框架Scrapy