欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)