首页 > 代码库 > 爬虫:Scrapy2 - Items

爬虫:Scrapy2 - Items

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

声明Item

import scrapyclass 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 productProduct(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 fieldTraceback (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 fieldTraceback (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 product2Product(name=Desktop PC, price=1000)>>> product3 = product2.copy()>>> print product3Product(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 dictTraceback (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