程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

Item

发布于2019-08-08 11:24     阅读(442)     评论(0)     点赞(2)     收藏(5)


抓取的主要目标是从非结构化源(通常是网页)中提取结构化数据
ScrapySpider可以以python字典的形式返回提取的数据,这很方便和熟悉
但python dicts缺乏结构,很容易在字段名中输入错误或返回不一致的数据,特别是在有许多spider的大型项目中

若要定义公共输出数据格式,scrapy提供了Item类
Item对象是用于收集抓取的数据的简单容器,它提供了一个类似于字典的API,该API语法方便简洁,用于声明可用字段

很多Scrapy的其他组件会使用Item提供的抓取信息,如
  1) exporters会查看声明的字段来确定要导出的列
  2) 使用Item的字段元数据自定义序列化
  3) trackref会跟踪Item实例以帮助查找内存泄漏

可以为每个字段指明任何类型的元数据
Field 对象对接受的值没有任何限制,因此文档也无法提供所有可用的元数据的键(key)参考列表
Field 对象中保存的每个键可以由多个组件使用,并且只有这些组件知道这个键的存在
可根据需求,定义使用其他的 Field 键。
设置 Field 对象的主要目的就是在一个地方定义好所有的元数据。
一般来说,那些依赖某个字段的组件肯定使用了特定的键(key),必须查看组件相关的文档,查看其用了哪些元数据键(metadata key)

 

  声明Item

  声明的scrapy项与django模型类似,只是scrapy项要简单得多,因为没有不同字段类型的概念

  Item对象
    class scrapy.item.Item([arg]) #通过指定可选的参数返回一个Item对象
    Item对象复制了标准的dict API,包括constructor,除了标准的dict API,额外提供的只有属性fields
    该对象可以理解为一个字典,该字典包含了所有声明的fields,包括设定过值和没设定过值的fields
    其中,key就是Item对象里定义的fields,values就是Item对象里定义的Field对象

  Field对象
    class scrapy.item.Field([arg])
    Field类实际上就是内置的python字典类型,它不提供额外的属性和方法

复制代码
import scrapy

class Product(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    stock = scrapy.Field()
    last_updated = scrapy.Field(serializer=str)  #serializer就是字段last_updated的metadata key
复制代码

 

  使用Item

复制代码
    product = Product(name='Desktop PC', price=1000)  #创建Item
    
    product['name']  #输出:Desktop PC
    product['price']  #输出:1000
    product['last_updated']  #报错,not set
    
    product.get('name')  #输出:Desktop PC
    product.get('last_updated')  #输出:not set
    product.get('lala')  #报错,没有该key
    
    'name' in product  #输出:True,判断name是否设定了值
    'last_updated' in product  #输出:False,判断last_updated是否设定了值
    'last_updated' in product.fields  #输出:True,判断last_updated是否被声明
    'lala' in product.fields  #输出:False,判断lala是否被声明
    
    product['last_updated'] = 'today'  #设定值
    product['lala'] = 'test'  #报错,lala字段没有被声明
    
    product.keys()  #输出:['price', 'name']
    product.items()  #输出:[('price', 1000), ('name', 'Desktop PC')]
    
    product2 = Product(product)   #复制product item
    product3 = product2.copy()   #复制product2 item
    
    dict(product)  #输出:{'price': 1000, 'name': 'Desktop PC'},通过item复制dict
    Product({'name': 'Laptop PC', 'price': 1500})  #通过dict创建item
复制代码

 

  扩展Item

    class ExtendedProduct(Product):
        discount_percent = scrapy.Field(serializer=str)  #追加新的字段
        discount_expiration_date = scrapy.Field() #追加新的字段
        #修改既存字段,保持原来name字段的元数据不变,并追加了serializer metadata key
        name = scrapy.Field(Product.fields['name'], serializer=my_serializer)  

 



所属网站分类: 技术文章 > 博客

作者:343ueru

链接:https://www.pythonheidong.com/blog/article/13635/280ab8c1711f95fed35d/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

2 0
收藏该文
已收藏

评论内容:(最多支持255个字符)