爬蟲:Scrapy3 - Items


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 聲明語法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM