Item
抓取的主要目标是从非结构化源(通常是网页)中提取结构化数据
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)
Item的更多相关文章
- 为.NET Core项目定义Item Template
作为这个星球上最强大的IDE,Visual Studio不仅仅提供了很多原生的特性,更重要的是它是一个可定制的IDE,比如自定义Project Template和Item Template就是一个非常 ...
- [转]NopCommerce How to add a menu item into the administration area from a plugin
本文转自:http://docs.nopcommerce.com/display/nc/How+to+code+my+own+shipping+rate+computation+method Go t ...
- ListView中item定位
ListView 实现定位特定 item 最近在项目中需要使 ListView 能跳转到特定的 item,查阅文档后,发现 ListView 有以下几种方法可供使用: smoothScrollToPo ...
- android 在 ListView 的 item 中插入 GridView 仿微信朋友圈图片显示。
转载请声明出处(http://www.cnblogs.com/linguanh/) 先上张效果图: 1,思路简述 这个肯定是要重写 baseAdapter的了,这里我分了两个数据适配器,一个是自定义的 ...
- Listview的Item中有CheckBox、Button等的焦点处理
ListView的item布局中有CheckBox.Button等会获取焦点的控件会抢走焦点,造成ListView的item点击事件相应不了. 解决方法:控件设置 android:clickable= ...
- ListView之多种类型Item
一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍 ...
- C# 在Repeater 的ItemDataBound 如何转换e.Item.DataItem 的类型
1.使用DataSet和DataTable绑定数据源时,用 DataRowView view = (DataRowView)e.Item.DataItem; 2.DataReader绑定数据源时,用 ...
- zabbix利用api批量添加item,并且批量配置添加graph
关于zabbix的API见,zabbixAPI 1item批量添加 我是根据我这边的具体情况来做的,本来想在模板里面添加item,但是看了看API不支持,只是支持在host里面添加,所以我先在一个ho ...
- RN中listView的每个item等高
今天写ListView的每个Item的布局的时候发现,当文字太长时被截掉了不能完全显示,检查了很久发现没有设置固定高度都是可伸缩的为什么没有伸缩呢.看了很久才发现每个item是等高的,于是仔细检查才看 ...
- ListView只更新某个item
方案1:针对需要更新的item调用public View getView(int position, View convertView, ViewGroup parent)即可.如: public c ...
随机推荐
- C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) C#各版本新特性 C#版本和.NET版本以及VS版本的对应关系
C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) 2017年08月06日 11:53:13 阅读数:6705 历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有1 ...
- MCE----Machine-check exception
http://en.wikipedia.org/wiki/Machine_Check_Exception Machine-check exception From Wikipedia, the fre ...
- tomcat重启报错
一.tomcat重启报java环境变量错 报错信息详细如下: Neither the JAVA_HOME nor the JRE_HOME environment variable is define ...
- LeetCode 112 Path Sum(路径和)(BT、DP)(*)
翻译 给定一个二叉树root和一个和sum, 决定这个树是否存在一条从根到叶子的路径使得沿路全部节点的和等于给定的sum. 比如: 给定例如以下二叉树和sum=22. 5 / \ 4 8 / / \ ...
- JVM的CPU资源占用过高问题的排查
互联网后端架构 https://mp.weixin.qq.com/s/LiqAy2DikbmZzqogb5XRdA JVM的CPU资源占用过高问题的排查 互联网后端架构 今天 上午线上某应用的一台J ...
- 【腾讯bugly干货分享】精神哥手把手教你怎样智斗ANR
上帝说要有ANR,于是Bugly就有了ANR上报.那么ANR究竟是什么? 近期非常多童鞋问起精神哥ANR的问题,那么这次就来聊一下,鸡爪怎么泡才好吃.噢不,是怎样高速定位ANR. ANR是什么 简单说 ...
- Handler有何作用?怎样使用?
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012974916/article/details/24580405 一 Handler作用和概念 ...
- window10 java 环境变量配置
JAVA_HOME (可有可无) CLASSPATH : C:\Program Files\Java\jdk1.8.0_91\lib\dt.jar;C:\Program Files\Java\j ...
- Ubuntu下如何安装并使用Objective-C
Objective-C是本人用过的最佳类C.面向对象的编程语言.Objective-C与标准C完美兼容,而在此基础上又加上了将面向对象的基础概念诠释得最好的SmallTalk元素,使得它既简洁.又灵活 ...
- html5--6-65 布局4-弹性布局
html5--6-65 布局4-弹性布局 实例 学习要点 掌握传统布局与CSS3新增弹性布局方式的实现和应用 弹性布局(弹性伸缩布局) 事实上它是一种新类型的盒子模型,也有书上称作弹性伸缩盒布局. 比 ...