Items
项目类
爬虫的目的在于从非结构化的数据源中提取结构化的数据,例如这些网页就是非结构化的。 为了达到这样的目的,Scrapy 提供了类 。
对象是用来收集抓取数据的简单容器。 他们提供了带有简单语法的 类字典接口来声明它们的有效区域。
Declaring Items
声明项目类
用一段简单的类定义语法和区块 对象来声明Items。
下面是个例子:
from scrapy.item import Item, Fieldclass Product(Item): name = Field() price = Field() stock = Field() last_updated = Field(serializer=str)
注意
熟悉 的人可能会发现Scrapy 的Items声明类似 , 只不过Scrapy的 Items 更简单,它没有关于不同区域类型的定义。
Item Fields
Item 域
对象用来指定每个域的元数据。例如,在上面的例子中生命的的last_updated域的serializer函数。
你可以为每个域指定任意的元数据。 对象接受的值类型没有限制。 出于同样的原因,没有全部可用元数据类型的参考列表。每个在 对象中定义的key都可以被别的部分所用,并且只有这些部分才知道这个key。你也可以根据需要在你的工程里定义和使用任何其他的 key。The main goal of 对象的主要目的就是提供一种方法,使得所有的元数据都可以在一个地方定义。典型的, 那些行为依赖域的部分使用确定的 field keys来配置他们的行为。你必须参考他们的文档来了解元数据keys正被哪个部分所用。
有件很重要的事情你必须知道,那些用来声明item的域对象不像类属性一样是待分配的。作为替代,你可以通过的属性去访问他们。
关于声明items的事情就讲到此为止。
Working with Items
使用Items
下面几个例子讲了使用items的普通任务,其中用的是上面声明的 Product
item类 . 你会发现 API很接近 .
Creating items
创建items
>>> product = Product(name='Desktop PC', price=1000)>>> print productProduct(name='Desktop PC', price=1000)
Getting field values
获取域中的值
>>> 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'] # 请求未知的域出错Traceback (most recent call last): ...KeyError: 'lala'>>> product.get('lala', 'unknown field')'unknown field'>>> 'name' in product # name 是否在product中?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 # lala 是否是已声明的域?False
Setting field values
设置域中的值
>>> 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'
Accessing all populated values
访问所有已填入的值
要访问所有已填入的值,只需要访问经典的 :
>>> product.keys()['price', 'name']>>> product.items()[('price', 1000), ('name', 'Desktop PC')]
Other common tasks
其他的小任务
复制 items:
>>> product2 = Product(product)>>> print product2Product(name='Desktop PC', price=1000)>>> product3 = product2.copy()>>> print product3Product(name='Desktop PC', price=1000)
根据 items创建字典:
>>> dict(product) # create a dict from all populated values{'price': 1000, 'name': 'Desktop PC'}
根据字典创建 items:
>>> 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'
Extending Items
扩展的Items
你可以通过在原始Item中声明子类来扩展 Items (增加更多的域 或者更改某些域的元数据)。
例如:
class DiscountedProduct(Product): discount_percent = Field(serializer=str) discount_expiration_date = Field()
你也可以扩展域元数据,在先前的域元数据中增加更多的值或者修改已有的值,向下面这样:
class SpecificProduct(Product): name = Field(Product.fields['name'], serializer=my_serializer)
给 name
域添加(或替换) serializer
元数据键 , 保持原有元数据的值。
Item objects
Item 对象
class
scrapy.item.
Item
([arg])返回一个使用给定参数初始化的新Item
Items 复制了标准的 , 甚至包括了它的构造函数。 Items 只是附加了一个属性:
fields
字典包含了这个Item的所有已声明fields, 而不仅是已经在里面的那些. 键就是field的名字,值就是在中使用的 对象.
Field objects
Field对象
class
scrapy.item.
Field
([arg])类只是内建字典类的别名,它并不提供任何额外的功能和属性。换句话说, 对象就是一个普通的Python字典. 使用独立的类来支持基于类属性的项目声明语法( )。