1、Item 和 Field

  Scrapy 提供一下两个类,用户可以使用它们自定义数据类,封装爬取到的数据:

  (1)Item类

    自定义数据类(如 BookItem)的基类

  (2)Field

    用来描述自定义数据类包含那些字段(如 name、age等)

  自定义一个数据类,只需继承 Item ,并创建一系列 Field 对象的类属性(类似 Django 中自定义 Model)即可。以自定义书籍信息 BookItem为例

>>>from scrapy import Item, Field
>>> class BookItem(Item):
name = Field()
price = Field(

  Item 支持字典接口,因此 BookItem 在使用上和 Python 字典类似,可安一下方式创建BookItem对象:

>>> book = BookItem(name = 'jj', price = 45.0)
>>> book
{'name': 'jj', 'price': 45.0}
>>> book['name']
'jj'
>>> book2 = BookItem()
>>> book2
{}
>>> book2['name'] = 'jjj'
>>> book2['price'] = 32.5
>>> book2
{'name': 'jjj', 'price': 32.5}

2、Item Pipeline 处理数据

  在 Scrapy 中,Item Pipeline 是处理数据的组件,一个 Item Pipeline 就是一个包涵特定接口的类,同城负责一种功能的数据处理,在一个项目中可以同时启用多个 Item Pipeline,他们按指定次序连起来,形成一条数据处理流水线。

  以下就是 Item Pipeline 的几种典型应用:

  (1)清洗数据

  (2)验证数据的有效性

  (3)过滤掉重复的数据

  (4)将数据存入数据库

通过一个需求来讲解 Item Pipeline 的使用,比我如我们爬取的书籍价格是以英镑为单位的;如果我们期望爬去的书价是人命币价格,就需要用英镑价格乘以汇率算出人命币价格(处理数据),此时可以实现一个接个转换的 Item Pipeline 来完成这个工作。

  实现 Item Pipeline

    在创建 Scrapy 项目时,会自动生成一个 pipeline.py 文件,它用来放置用户自定义的 Item Pipeline:

class PriceConverPieline(object):

    # 英镑兑换人命币汇率
exchange_rate = 8.5309 def process_item(self, item, spider):
# 提取 Item 的price字段
# 去掉前面英镑符号,转换为float 类型,乘以汇率
price = float(item['price'[:]])*self.exchange_rate # 保留 为小数,赋值回item的price 字段
item['price'] = '¥%.2f'% price return item

对上面的代码解释如下:

  (1)一个 Item  Pipeline 不需要继承特定的基类,只需要实现某些特定方法,例如 process_item、open_spider、close_spider

  (2)一个Item Pipeline必须实现一个Process_item(item, spider)方法,该该方法用来处理每一项由Spider 爬取的数据,其中的两个参数:

    <1> Item   爬取到的一项数据(Item 或者字典)

    <2> Spider   爬取此项数据的 Spider对象

  上述代码中的 process_item 方法实现非常简单,将书籍的英镑价格转换为浮点数,乘以汇率并保留 2 为小数,然后复制回item的price字段,最后返回被处理过的item

  可以看出,process_item 方法是 Item Pipeline 的核心,对该方法需要做两点补充说明:

    (1)如果process_item 下处理某项 item 时返回了一项数据(item或字典),返回的数据会传递到下一级的 Item Pipeline(如果有)继续处理

    (2)如果process_item 在处理某项 item 时抛出(raise)一个DropItem异常(scrapy.exceptions.DropItem),该项 item 便会被抛弃,不在传递给后面的 Item Ppieline继续处理,也不会导出到文件。通常,我们在检测到无效数据或想要过滤数据时,抛出 DropItem异常。

  除了必须实现process_item方法外,还有3个比较常用的方法,可用于需求选择实现:

  (1)open_spider(self, spider)

    Spider 打开时(处理数据前)回调该方法,同城方法用于在开始处理数据之前完成某些初始化工作,如连接数据库

  (2)close_spider(self, spider)

    Spider 关闭时(处理数据后)回调该方法,同城该方法用于在处理完成数据之后完成某些清理工作,如关闭数据库

  (3)from_crawler(cls, crawler)

    创建 Item Pipeline对象时回调该方法,通常,在该方法中通过 crawler.setting 读取配置,根据配置创建Item Pipeine对象

3、启用 Item Pipeline

  在 Scrapy 中,Item Pipeline是可选的组件,想要启用某个(或某些)Item Pipeline,需要在配置文件settings.py中进行配置

ITEM_PIPELINE = {
'example.pipelines.PriceConverterPipeline' :
}

ITEM_PIPELINE 是一个字典,我们想要启用 Item Pipelne添加到这个字典中,其中每一项的键是每一个Item Pipelne类的导入路径,值是 0 ~ 1000 的数字,同事启用多个 Item Pipeline 时,Scrapy根据这些数值决定各 Item Pipeline 处理数据的先后次序,数字小的在前面。使用PriceConverterPipelien对数据处理后,books.csv 中的书价转换为人民币价格

4、过滤重复数据

  为了确保爬取到的书籍信息中没有重复项,可以实现一个去重 Item Pipeline,这里我们一书名作为主键进行去重,实现DuplicatesPipeline

from scrapy.ecceptions import DropItem

class DuplicatedPipeline(object):

    def __nit__(self):
self.book_set = set() def process_item(self, item, spider):
name = item['name']
if name in self.book_set:
raise DropItem('Dupliccate book found: %s' % item) self.book_set.add(name)
return item

对上述代码解释如下:

  (1)增加构造方法,在其中初始化用于对书名去重的集合

  (2)在 process_item 方法中, 先取出 item 的 name 字段,检查书名是否已在集合中,如果在,就是重复数据,抛出DropItem异常。将 item 抛弃,否则,将 item的 name 字段存入集合,返回 item

5、将数据存入 MongoDB

  有时,我们想把爬取到的数据存入某种数据库中,可以实现 Item Pipeline完成此类任务

  下面实现一个能将数据存入 MongoDB数据库的 Item Piipeline,代码如下:

from scrapy.item import import Item
import pymongo class MongeDBPipeline(object): DB_URI = 'mongodb://localhost:27017/'
DB_NAME = 'scrapy_data' def open_spider(self, spider):
self.client = pymongo.MongoClient(self.DB_URI) def close_spider(self, spider):
self.client.close() def process_item(self, spider):
collection = self.db[spider,name]
post = dict(item) if isinstance(item, Item) else item
collection.insert_one(post)
return item

对上述代码解释如下:

  (1)在类属性中定义两个常量:

    <1>DB_URI  数据库的 URI 地址

    <2> DB_NAME  数据库的名字

  (2)在Spider整个爬取过程中,数据库的连接和关闭操作只需要进行一次,应在开始处理数据前连接数据库,并在处理完所有数据之后关闭数据路

    <1>open_spider(spider)

    <2> close_spider(spider)

Scrapy 使用 Item 封装数据、使用 Item Pipline处理数据的更多相关文章

  1. Scrapy系列教程(2)------Item(结构化数据存储结构)

    Items 爬取的主要目标就是从非结构性的数据源提取结构性数据,比如网页. Scrapy提供 Item 类来满足这种需求. Item 对象是种简单的容器.保存了爬取到得数据. 其提供了 类似于词典(d ...

  2. scrapy学习笔记(三):使用item与pipeline保存数据

    scrapy下使用item才是正经方法.在item中定义需要保存的内容,然后在pipeline处理item,爬虫流程就成了这样: 抓取 --> 按item规则收集需要数据 -->使用pip ...

  3. 读书笔记 effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)

    假设你正在操作一个Rectangle类.每个矩形可以通过左上角的点和右下角的点来表示.为了保证一个Rectangle对象尽可能小,你可能决定不把定义矩形范围的点存储在Rectangle类中,而是把它放 ...

  4. 小白学 Python 爬虫(38):爬虫框架 Scrapy 入门基础(六) Item Pipeline

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. 爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline

    1. Spider Middleware Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架. 当Downloader生成Response之后,Response会被 ...

  6. Scrapy 通过登录的方式爬取豆瓣影评数据

    Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...

  7. scrapy抓取拉勾网职位信息(七)——数据存储(MongoDB,Mysql,本地CSV)

    上一篇完成了随机UA和随机代理的设置,让爬虫能更稳定的运行,本篇将爬取好的数据进行存储,包括本地文件,关系型数据库(以Mysql为例),非关系型数据库(以MongoDB为例). 实际上我们在编写爬虫r ...

  8. scrapy+selenium 爬取淘宝商城商品数据存入到mongo中

    1.配置信息 # 设置mongo参数 MONGO_URI = 'localhost' MONGO_DB = 'taobao' # 设置搜索关键字 KEYWORDS=['小米手机','华为手机'] # ...

  9. 爬虫(十七):Scrapy框架(四) 对接selenium爬取京东商品数据

    1. Scrapy对接Selenium Scrapy抓取页面的方式和requests库类似,都是直接模拟HTTP请求,而Scrapy也不能抓取JavaScript动态谊染的页面.在前面的博客中抓取Ja ...

随机推荐

  1. 数据分析--excel

    excel 的使用 1.excel基础 1.数据类型 数字类型 字符类型 注意: 1.普通文本:默认作对齐,左上方没有小绿点,数字默认又对齐 2.数字存储为文本类型,美容默认为左对齐,左上方有小绿点 ...

  2. 超长干货丨Kubernetes网络快速入门完全指南

    Kubernetes网络一直是一个非常复杂的主题.本文将介绍Kubernetes实际如何创建网络以及如何为Kubernetes集群设置网络. 本文不包括如何设置Kubernetes集群.这篇文章中的所 ...

  3. 前x个数据中至少有m个元素最小值与最大值之差不超过K

    题意 给一组数据,从左到右开始,寻找最小的x,使得第1个元素到第x个元素中,至少存在m个数据,最小值与最大值之差不超过K. INPUT 第一行是T,代表数据组数 每组数据的第一行是三个整数,n.m.k ...

  4. 【代码总结】PHP之会话跟踪技术

    有些时候感觉自己学习的效率好低,一套教程一本书,反复听,反复看,反复敲代码.自学这条路真的是很艰难,在任何事情都没有成功之前都很枯燥乏味.自学的过程中总会遇到很多问题,有时候连错误的原因都找不出来,那 ...

  5. 安装完 Ubuntu 16.04.1,重启出现[sda] Assuming drive cache: write through的问题

    重装了一下ubuntu,安装成功后重启出现了这个问题 刚开始以为是重启慢,就没在意这么多,可是我等了半个小时,(我特么的真闲,其实是忙别的忘了),还不行,咦,然后我就去找了找问题,哈哈哈哈 看图说话, ...

  6. IDEA 下的 github 创建提交与修改

    本章假定你已经安装了 git 客户端,本文仅仅使用与 Mac 环境下,未在 Window下实验,但 IDEA 在 Window 和 Mac 下软件的使用方法是一致的. 1 配置账号 IDEA 需要配置 ...

  7. 命令关闭tomcat

    1.netstat -ano|findstr 8080(默认端口为8080) 2. taskkill /F /PID 17652 关闭后面的进程号(17652),直到输入上面第三个命令查不到占用808 ...

  8. [原]用SQL比较两张结构完全相同的表数据

    前几天面试遇到一个比较有意思的问题,就是有两张结构完全相同的表A和B,但是这两张表属于不同的业务流程,经过一段时间后发现两张表的数据不能完全匹配,有可能A比B多,也可能B比A多,或者两种可能同时存在, ...

  9. SpringMVC中在Controller类的每个方法执行前调用某个方法的实现

    在使用SpringMVC做项目的时候,如果想在@Controller类中每个@RequestMapping方法执行前都调用某个方法,要怎么实现呢?答案是使用Spring的@ModelAttribute ...

  10. idea提交项目到码云

    1.安装Git 2.在码云上创建项目 3.在IDEA提交项目到码云