前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫课堂(十九)|编写Spider之使用Item封装数据

爬虫课堂(十九)|编写Spider之使用Item封装数据

作者头像
黄小怪
发布2018-05-21 17:36:28
9070
发布2018-05-21 17:36:28
举报
文章被收录于专栏:小怪聊职场小怪聊职场

在前面的章节我们学习了使用Selector提取数据,那么接下来要做的就是如何封装这些数据。以提取简书文章信息为例,我们需要获取文章标题,文章URL和文章的作者名称信息字段。应该用怎样的数据结构来封装这些零散的信息字段呢?最简单的方式就是使用Python字典(dict),如下。

代码语言:javascript
复制
jianshu = 
----{
--------'title': '文章标题', 
--------'url': '文章URL', 
--------'author_name':'文章的作者'
----}

但是使用Python字典存储字段信息有如下缺点:

  • 无法一目了然地了解数据中包含哪些字段,影响代码可读性。
  • 缺乏对字段名字的检测,容易因程序员的笔误而出错。
  • 不便于携带元数据(传递给其他组件的信息)。

为解决上述问题,在Scrapy中可以使用自定义的Item来封装数据。Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便。Item提供了类字典的API,并且可以很方便的声明字段,很多Scrapy组件可以利用Item的其他信息。 一、Item和Field介绍 Scrapy提供了两个类用来封装数据:

  • Item基类 自定义数据类的基类。
  • Field类 用来描述自定义数据类包含哪些字段。

定义Item非常简单,只需要继承scrapy.Item类,并将所有字段都定义为scrapy.Field类型即可。 以获取简书文章信息为例,我们要获取文章标题,文章URL和文章的作者名称。对此,在Item中定义相应的字段。

代码语言:javascript
复制
import scrapy
class JianshuItem(scrapy.Item):
----title = scrapy.Field()
----url = scrapy.Field()
----author_name = scrapy.Field()

二、Item字段(Item Fields) Field对象指明了每个字段的元数据(metadata)。例如下面例子中 author_name 中指明了该字段的序列化函数。

代码语言:javascript
复制
import scrapy
class JianshuItem(scrapy.Item):
----title = scrapy.Field()
----url = scrapy.Field()
----author_name = scrapy.Field(serializer=str)

可以为每个字段指明任何类型的元数据, Field 对象对接受的值没有任何限制。Field 对象中保存的每个键可以由多个组件使用,并且只有这些组件知道这个键的存在。设置 Field 对象的主要目的就是在一个地方定义好所有的元数据。一般来说,那些依赖某个字段的组件肯定使用了特定的键(key)。如下例子,元数据的种类非常多。

代码语言:javascript
复制
import scrapy
class ExampleItem(scrapy.Item):
# field_1有两个元数据,a是一个字符串,b是列表
----field_1 = scrapy.Field(a='hello', b=[1,2,3]) 
# field_2有一个元数据,a是一个函数
----field_2 = scrapy.Field(a=num(1:n))

至于它们在实战上是如何使用的,将在实战章节做详细讲解,目前只要了解有这些内容即可。 三、Item Loader Item Loader为我们提供了生成Item的相当便利的方法。Item为抓取的数据提供了容器,而Item Loader可以让我们非常方便的将输入填充到容器中。 下面通过一个例子来展示一般使用方法:

代码语言:javascript
复制
from scrapy.loader import ItemLoader  
from myproject.items import JianshuItem  

def parse(self, response):  
----jianshu_item = ItemLoader(item=JianshuItem(), response=response)  
----jianshu_item.add_xpath('title', '获取对应元素的XPath表达式')  
----jianshu_item.add_xpath('url', '获取对应元素的XPath表达式')  
----jianshu_item.add_xpath('author_name', '获取对应元素的XPath表达式')  
----return jianshu_item.load_item()  

四、扩展Item 可以通过继承原始的Item来扩展Item(添加更多的字段或者修改某些字段的元数据)。有些时候,我们会根据需求对已有的Item进行扩展。比如我们有一个特定的爬虫需要采集这篇文章的发布时间,那么可以继承JianshuItem定义一个ParticularJianshuItem类,在其中添加一个时间的字段,代码如下:

代码语言:javascript
复制
import scrapy
class JianshuItem(scrapy.Item):
----title = scrapy.Field()
----url = scrapy.Field()
----author_name = scrapy.Field()

class ParticularJianshuItem(JianshuItem):
----time = Field()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.03.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档