Scrapy学习笔记V--Items 爬虫数据的存储.数据模板

  1. 当我们利用爬虫程序从源数据中提取(extract)自己所需要的数据,如N个电影名,N个电影作者,不同排名,不同点赞数,不同下载地址,文章内容或者一些其他数据,并把这些提取的内容存储到一个Python字典中返回

  2. 但是字典存储数据会出现排版或者前后不一致的情况,尤其是在大型的爬虫程序中

  3. 那提取的数据应该保存在哪里?又能保持数据的一致性呢?

Item scrapy中item 类 中提供容器收集这些爬取的数据并定义这些数据的存储格式

declaring items声明item对象

import scrapy

class Product(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    stock = scrapy.Field()
    last_updated = scrapy.Field(serializer=str)
 field对象为每一个field指定元数据,各种类型的元数据都可,组件会找到各自的元数据的keys。field为Item.field中的属性元素

Working with Items操作items 和dict(字典)类似

  • Creating items (Product类已经在上面声明,定义items)
 >>> product = Product(name='Desktop PC', price=1000)
>>> print product
Product(name='Desktop PC', price=1000)
  • Getting field values (获取field中的值)
 >>> 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
  • Setting field values #设置field的值
>>> 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'
  • Accessing all populated values #获得已定义好的数据
>>> product.keys()    #获取键值
['price', 'name']

>>> product.items()    #获取键值和数据
[('price', 1000), ('name', 'Desktop PC')]
  • Other common tasks
     - Copying items : product2 = Product(product)   product3=product2.copy     #复制item对象
     - Creating dicts from items :  dict(product) # 从所有已经填入field字段中 创建一个字典容器
     - Creating items from dicts : Product({'name': 'Laptop PC', 'price': 1500})    #从字典中创建item  键值需已经声明过
  • Extending Items 你可以通过子类扩展你的item数据模型,增加或者改变一些元数据
class DiscountedProduct(Product):
    discount_percent = scrapy.Field(serializer=str)
    discount_expiration_date = scrapy.Field()

可以把最开始定义的元数据字段(previous metadata)

class SpecificProduct(Product):
    name = scrapy.Field(Product.fields['name'], serializer=my_serializer)       #保持最初定义的name字段key-value
  • Item objects

    class scrapy.item.Item([arg])

    重写字典标准,唯一属性fields
  • Field objects

    class scrapy.item.Field([arg])

    字典的别名,没有额外的功能和属性

如有错误请指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值