项目
刮取的主要目标是从非结构化源(通常是网页)中提取结构化数据。 Scrape蜘蛛可以将Python提取的数据返回。虽然方便和熟悉,Python只是缺乏结构:容易造成字段名称中的输入错误或返回不一致的数据,特别是在具有许多蜘蛛的较大项目中。
要定义常用的输出数据格式Scrapy提供了Item类。物品对象是用于收集刮取数据的简单容器。它们提供一个类似字典的API,具有方便的语法来声明其可用字段。
各种Scrapy组件使用项目提供的额外信息:出口商查看声明的字段以找出要导出的列,序列化可以使用Item字段metadata,trackref跟踪Item实例来帮助查找内存泄漏(请参阅使用trackref调试内存泄漏)等。
声明项目
项目使用简单的类定义语法和Field对象进行声明。这是一个例子:
进口刮板
类产品(scrapy.Item):
name = scrapy.Field()
价格= scrapy.Field()
股票= scrapy.Field()
last\_updated = scrapy.Field(serializer = str)
注意
熟悉Django的人会注意到,Scrapy Items被声明类似于Django Models,除了Scrapy Items要简单得多,因为没有不同的场类型的概念。
项目字段
字段对象用于为每个字段指定元数据。例如,上面示例中所示的last_updated字段的serializer函数。
您可以为每个字段指定任何种类的元数据。 Field对象接受的值没有限制。出于同样的原因,没有所有可用元数据密钥的参考列表。 Field对象中定义的每个键都可以被不同的组件使用,只有这些组件知道它。您也可以根据自己的需要定义和使用项目中的任何其他Field键。 Field对象的主要目标是提供一种在一个位置定义所有字段元数据的方法。通常,其行为取决于每个字段的组件使用某些字段键配置该行为。您必须参考他们的文档来查看每个组件使用哪些元数据键。
重要的是要注意,用于声明该项目的Field对象不会被分配为类属性。而是可以通过Item.fields属性访问它们。
使用项目
以下是使用上述声明产品项目执行的常见任务示例。你会注意到API与dict API非常相似。
创建项目
>>> product = Product(name ='台式电脑',价格= 1000)
>>>打印产品
产品(name ='台式电脑',价格= 1000)
获取字段值
>>>产品['name']
桌上型电脑
>>> product.get('name')
桌上型电脑
>>>产品['price']
1000
>>>产品['last_updated']
追溯(最近呼叫最后):
...
KeyError:'last_updated'
>>> product.get('last_updated','not set')
没有设置
>>>产品['lala']#获取未知字段
追溯(最近呼叫最后):
...
KeyError:'lala'
>>> product.get('lala','unknown field')
'未知字段'
>>>'name'在产品#中的名称字段填充?
真正
产品#中的“last_updated”是last_updated吗?
假
>>>'last_updated'在product.fields#last_updated一个声明的字段?
真正
>>>'lala'在product.fields#是lala一个声明的字段?
假
设置字段值
>>> product ['last_updated'] ='今天'
>>>产品['last_updated']
今天
>>> product ['lala'] ='test'#设置未知字段
追溯(最近呼叫最后):
...
KeyError:'产品不支持字段:lala'
访问所有填充值
要访问所有填充值,只需使用典型的dict API:
>>> product.keys()
['price','name']
>>> product.items()
[('price',1000),('name','台式电脑')]
其他常见任务
复制项目:
>>> product2 =产品(产品)
>>>打印产品2
产品(name ='台式电脑',价格= 1000)
>>> product3 = product2.copy()
>>>打印产品3
产品(name ='台式电脑',价格= 1000)
从项目创建滴滴:
>>> dict(product)#从所有填充的值创建一个dict
{'price':1000,'name':'台式电脑'}
从案件创建项目:
>>>产品({'name':'Laptop PC','price':1500})
产品(价格= 1500,名称='笔记本电脑')
>>>产品({'name':'Laptop PC','lala':1500})#warning:dict中的未知字段
追溯(最近呼叫最后):
...
KeyError:'产品不支持字段:lala'
扩展项目
您可以通过声明原始项目的子类来扩展项目(添加更多字段或更改某些字段的某些元数据)。
例如:
类折扣产品(产品):
discount\_percent = scrapy.Field(serializer = str)
discount\_expiration\_date = scrapy.Field()
您还可以通过使用先前的字段元数据并附加更多值或更改现有值来扩展字段元数据,如下所示:
class SpecificProduct(产品):
name = scrapy.Field(Product.fields \['name'\],serializer = my\_serializer)
它为名称字段添加(或替代)序列化程序元数据密钥,保留所有先前存在的元数据值。
物品对象
class scrapy.item.Item([arg])
返回一个可以从给定参数初始化的新项目。
项目复制标准dict API,包括其构造函数。项目提供的唯一附加属性是:
领域
包含此项目的所有声明字段的字典,不仅包含这些填充。键是字段名称,值是Item声明中使用的Field对象。
现场对象
类scrapy.item.Field([arg])
Field类只是内置dict类的别名,不提供任何额外的功能或属性。换句话说,Field对象是简单的Python脚本。一个单独的类用于支持基于类属性的项目声明语法。
下一页上一页