zoukankan      html  css  js  c++  java
  • scrapy框架【sitems项目】

    scrapy框架之items项目

     

    Items

      主要目标是从非结构化来源(通常是网页)提取结构化数据。Scrapy爬虫可以将提取的数据作为Python语句返回。虽然方便和熟悉,Python dicts缺乏结构:很容易在字段名称中输入错误或返回不一致的数据,特别是在与许多爬虫的大项目。

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

      各种Scrapy组件使用项目提供的额外信息:导出器查看声明的字段以计算要导出的列,序列化可以使用项字段元数据trackref 定制,跟踪项实例以帮助查找内存泄漏(请参阅使用trackref调试内存泄漏)等。

    声明项目

    使用简单的类定义语法和Field 对象来声明项目。这里是一个例子:

    复制代码
    import scrapy
    
    class Product(scrapy.Item):
        name = scrapy.Field()
        price = scrapy.Field()
        stock = scrapy.Field()
        last_updated = scrapy.Field(serializer=str)
    复制代码

    注意

    熟悉Django的人会注意到Scrapy Items被声明为类似于Django Models,只是Scrapy Items比较简单,因为没有不同字段类型的概念。

    项目字段

    Field对象用于为每个字段指定元数据。例如,last_updated上面示例中所示的字段的序列化函数。

    您可以为每个字段指定任何种类的元数据。对Field对象接受的值没有限制。出于同样的原因,没有所有可用元数据键的参考列表。Field对象中定义的每个键可以由不同的组件使用,并且只有那些组件知道它。您也可以定义和使用Field项目中的任何其他 键,为您自己的需要。Field对象的主要目标 是提供一种在一个地方定义所有字段元数据的方法。通常,那些行为取决于每个字段的组件使用某些字段键来配置该行为。您必须参考他们的文档,以查看每个组件使用哪些元数据键。

    重要的是要注意,Field用于声明项目的对象不会被分配为类属性。相反,可以通过Item.fields属性访问它们。

    使用项目

    下面是使用上面声明的Product项目对项目执行的常见任务的一些示例 。你会注意到API非常类似于dict API。

    在爬虫文件中导入Product这个项目类;

    复制代码
    import scrapy
    from taobao.items import Product
    
    class DowloadTaobaoSpider(scrapy.Spider):
        name = 'dowload_taobao'
        allowed_domains = ['www.taobao.com']
        start_urls = ['http://www.taobao.com/']
    
        def parse(self, response):
            # 实例化Product
            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'  #设置未知字段
    Traceback(最近调用最后一次):
        ... 
    KeyError:'产品不支持字段:lala'
    复制代码

    访问所有填充值

    要访问所有填充值,只需使用典型的dict API:

    >>> product.keys()
    ['price', 'name']
    
    >>> product.items()
    [('price', 1000), ('name', 'Desktop PC')]

    复制项目

    要复制项目,必须首先决定是要浅副本还是深副本。

    如果您的物品包含 mutable 值如列表或字典,一个浅拷贝将在所有不同的拷贝中保持对相同可变值的引用。

    例如,如果您有一个带有标记列表的项目,并且您创建了该项目的浅副本,那么原始项目和副本都具有相同的标记列表。向其中一个项目的列表中添加标记也会将标记添加到另一个项目中。

    如果这不是所需的行为,请使用深度复制。

    要创建项目的浅副本,可以调用 copy() 在现有项上 (product2 product.copy() )或从现有项实例化项类 (product2 Product(product) )

    要创建深度复制,请调用 deepcopy() 相反 (product2 product.deepcopy() )

    其他常见任务

    从项目创建字典:

    >>> dict(product) # create a dict from all populated values
    {'price': 1000, 'name': 'Desktop PC'}

    从dicts创建项目:

    复制代码
    >>> 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'
    复制代码
  • 相关阅读:
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    129. Sum Root to Leaf Numbers
    117. Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/youxiu123/p/11624489.html
Copyright © 2011-2022 走看看