SCRAPY_part4_Items
程序员文章站
2022-05-05 15:12:06
...
用 scrapy 的主要目的是从非结构性的数据源–网页中提取结构性的数据。scrapy 可以将抽取的数据以字典的形式返回。虽然使用字典很简单方便,但是字典形式缺乏结构性,如发生拼写错误,或返回缺乏一致性的数据,尤其是有很多 spider 的大工程中。Scrapy 提供了 Item 类来定义通用的输出数据格式。Item 对象是一个简单的容器,来盛放抽取的数据。它提供了
dictionary-like
的 API 及简便的语法来声明它可用的 fields。#一个简单的item类定义,Item 提供一个 dictionary-like API. Product() 类似于dict().... #Field 类没有特别的属性或方法。使用一个单独的类用于支持基于 class 属性的 item 声明语法。可以定义对象的元数据。比如: last_updated = scrapy.Field(serializer=str) class Product(scrapy.Item): name = scrapy.Field() price = scrapy.Field() stock = scrapy.Field() last_updated = scrapy.Field(serializer=str) #Item基本操作(类似dict) product = Product(name='Desktop PC', price=1000) >>>product['name'] Desktop PC >>>product.get('last_updated', 'not set') not set # 没定义这个Field >>> product['lala'] Traceback (most recent call last): >>> product.keys() ['price', 'name'] >>> product.items() [('price', 1000), ('name', 'Desktop PC')] #获取 Item 的 Field >>> product.fields {'last_updated': {'serializer': <class 'str'>}, 'name': {}, 'price': {}, 'stock': {}} #复制Item >>> product2 = Product(product) >>> print product2 Product(name='Desktop PC', price=1000) # 继承:您可以通过声明原始项目的子类来扩展项目(以添加更多字段或更改某些字段的某些元数据)。 #添加属性 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)
推荐阅读