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

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

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中定义相应的字段。

import scrapy
class JianshuItem(scrapy.Item):
----title = scrapy.Field()
----url = scrapy.Field()
----author_name = scrapy.Field()

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

import scrapy
class JianshuItem(scrapy.Item):
----title = scrapy.Field()
----url = scrapy.Field()
----author_name = scrapy.Field(serializer=str)

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

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可以让我们非常方便的将输入填充到容器中。 下面通过一个例子来展示一般使用方法:

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类,在其中添加一个时间的字段,代码如下:

import scrapy
class JianshuItem(scrapy.Item):
----title = scrapy.Field()
----url = scrapy.Field()
----author_name = scrapy.Field()

class ParticularJianshuItem(JianshuItem):
----time = Field()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python

linux每日命令(13):more命令

more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(s...

1041
来自专栏AndroidTv

带你了解源码中的 ThreadLocal提问源码分析小彩蛋应用场景

这次想来讲讲 ThreadLocal 这个很神奇的东西,最开始接触到这个是看了主席的《开发艺术探索》,后来是在研究 ViewRootImpl 中又碰到一次,而且...

631
来自专栏哲学驱动设计

WPF 中 ICollectionView 及 ItemsControl 相关的重点

为 OEA 框架 做 WPF 树型表格控件时,浪费了许多时间在一些知识点上,所以写了这篇博客总结一下,和各位博友分享。 ICollectionView 接口的简...

2016
来自专栏日常分享

Spring 学习笔记(五)—— Bean之间的关系、作用域、自动装配

  Spring提供了配置信息的继承机制,可以通过为<bean>元素指定parent值重用已有的<bean>元素的配置信息。

1052
来自专栏Python与爬虫

爬虫入门到精通-网页的解析(xpath)

本文章属于爬虫入门到精通系统教程第六讲 在爬虫入门到精通第五讲中,我们了解了如何用正则表达式去抓取我们想要的内容.这一章我们来学习如何更加简单的来获取我们想...

37015
来自专栏云飞学编程

scrapy框架精讲!如何在最短的时间内学会xpath语法

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

1041
来自专栏Java后端技术栈

Java多线程编程-(11)-面试常客ThreadLocal出现OOM内存溢出的场景和原理分析

1、首先看一下代码,模拟了一个线程数为500的线程池,所有线程共享一个ThreadLocal变量,每一个线程执行的时候插入一个大的List集合:

812
来自专栏Java进阶之路

ThreadLocal内存泄漏问题及如何解决

2056
来自专栏Danny的专栏

System.Data.SqlClient.SqlException: 将截断字符串或二进制数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

3954
来自专栏spring源码深度学习

Scrapy入门案例——腾讯招聘(CrawlSpider升级)

需求和上次一样,只是职位信息和详情内容分开保存到不同的文件,并且获取下一页和详情页的链接方式有改动。

2191

扫码关注云+社区

领取腾讯云代金券