zoukankan      html  css  js  c++  java
  • 爬虫:Scrapy3

    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 声明语法。

  • 相关阅读:
    【洛谷P4318】完全平方数
    【洛谷P2257】YY的GCD
    【洛谷P1403】约数研究
    【洛谷P3455】ZAP-Queries
    【CF600E】Lomsat gelral
    【BZOJ3289】Mato的文件管理 莫队+树状数组
    【洛谷P2585】三色二叉树
    【CF242E】Xor Segment
    【洛谷P4144】大河的序列
    hdu 1547(BFS)
  • 原文地址:https://www.cnblogs.com/sufei-duoduo/p/5857388.html
Copyright © 2011-2022 走看看