Scrapy 框架将爬取的数据通过管道进行处理,即 pipelines.py 文件。

管道处理流程

一、定义 item

item 表示的是数据结构,定义了数据包括哪些字段

class TianqiItem(scrapy.Item):
# define the fields for your item here like: city = scrapy.Field() # 城市
date = scrapy.Field() # 日期
hour = scrapy.Field() # 小时
day = scrapy.Field() # 白天

写法比较固定,不可随意更改;注意没有return

二、在爬虫中生成 item

爬虫组件必须将数据按 item 的结构进行组织

item['city'] = response.xpath('//a[@id="lastBread"]//text()').extract_first()[:-4]
item['date'] = '%s-%s-%s'%(year, month, day)
item['hour'] = hour

注意最终必须  return item;

而且可以 返回多个 item,return item, item2,在某管道中,如果用了 item的key,就自动选择有这个key的item,否则,所有item都会经过该处理。

三、在管道中处理

1. 爬虫生成的 item 自动进入管道;

2. 管道会判断 流入的数据 的类型 是否是 item;【即 item.py 中定义的类型】

3. 如果是 item 类型,进行后续处理,否则,忽略;

4. 返回 item,【必须返回,切记】【返回的 item 流入下一个管道,或者告诉引擎,处理完毕,否则引擎会阻塞】

5. 爬取下一个

class TianqiPipeline(object):
def __init__(self):
self.f = open('save.txt', 'ab') def process_item(self, item, spider):
print(item)
self.f.write(str(dict(item)))
return item def close_spider(self, spider):
self.f.close() class RedisPipeline(object):
def open_spider(self, spider):
host = spider.settings.get('REDIS_HOST', 'localhost')
port = spider.settings.get('REDIS_PORT', 6379)
db = spider.settings.get('REDIS_DB_INDEX', 0) self.redis_con = redis.StrictRedis(host=host, port=port, db=db) def process_item(self, item, spider):
self.redis_con.hmset('%s:%s:%s'%(item['city'], item['date'], item['hour']), dict(item))
return item def close_spider(self, spider):
self.redis_con.connection_pool.disconnect()

代码解释

必选方法:process_item,负责处理数据

可选方法:初始化,只在爬虫启动时进行初始化

可选方法:open_spider,在开始爬取数据之前被调用

可选方法:close_spider,爬取完数据后被调用

可选方法:from_crawler,获取配置

mongodb 示例,包含了上述方法

首先执行 from_crawler 获取配置,在 open_spider 中创建数据库连接

四、启动管道

在settings中配置即可

ITEM_PIPELINES = {
'tianqi.pipelines.TianqiPipeline': 300,
'tianqi.pipelines.RedisPipeline': 301,
}

存在问题

上面这种方式 会作用于所有爬虫;

我们可以在 管道中 判断 是哪个爬虫,根据 spider 参数,或者 根据 item 中的 key,但这种方法很冗余;

更好的做法是在 spider类 中配置 custom_settings 对象

# 类属性
custom_settings = {'ITEM_PIPELINES':
{'getProxy.pipelines.GetproxyPipeline': 300, }}

数据库存储

管道可以实现任何形式的存储,包括文件、数据库等;

而且可以存入各种数据库,如 sqlite、mysql、mongoDB、redis;

上面的例子实现了 redis、mongodb 的存储,其他大同小异,以后有机会再更新。

Scrapy 教程(十)-管道与数据库的更多相关文章

  1. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. 无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two]

    无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two] extjs技术交流,欢迎加群(201926085) 不管是几级下拉列表的联动实现本质上都是根据某个下拉列表的变化,去动态加载其 ...

  4. Unity3D脚本中文系列教程(十六)

    Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆  function OnPostprocess ...

  5. 黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block 到目前为止,我们使用的模块都是在同一个配置 ...

  6. [转]PostgreSQL教程(十六):系统视图详解

    这篇文章主要介绍了PostgreSQL教程(十六):系统视图详解,本文讲解了pg_tables.pg_indexes.pg_views.pg_user.pg_roles.pg_rules.pg_set ...

  7. Python爬虫框架Scrapy教程(1)—入门

    最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...

  8. Scrapy教程

    Scrapy教程 原文地址https://doc.scrapy.org/en/latest/intro/tutorial.html 此教程我们假设你已经装好了Scrapy,如果没有请查看安装指南.. ...

  9. RabbitMQ入门教程(十四):RabbitMQ单机集群搭建

    原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...

随机推荐

  1. mysql分组排序加序号

    参照https://www.cnblogs.com/CharlieLau/p/6737243.html 一.需求 新加一个Sort 字段,初始值为1,按照parentID分组添加sort值. 根据原数 ...

  2. Linux下lazarus交叉编译 win32[win64]

    环境 vmvare + deepin Linux64 + lazarus2.0.6 参考:https://wiki.freepascal.org/Cross_compiling_for_Win32_u ...

  3. 实验 5 Spark SQL 编程初级实践

    实验 5  Spark SQL 编程初级实践    参考厦门大学林子雨 1. Spark SQL 基本操作 将下列 json 数据复制到你的 ubuntu 系统/usr/local/spark 下,并 ...

  4. (77)一文了解Redis

    为什么我们做分布式使用Redis? 绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对  ...

  5. Java并发编程的艺术笔记(三)——Thread.join()

    t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒.并不影响同一时刻处在运行状态的其他线程.它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程.能够使得线程 ...

  6. 将Microsoft SQL Server 2000数据库转换成MySQL数据库

    1. 下载并安装MyODBC.(如果是XP请下载5.3的旧版本,8.x的新版本运行有问题) 2. 创建一个空的MySQL数据库. 3. 在Windows >> 控制面板 >> ...

  7. python 整数转字节 char

    把10进制整数30,转换为字节 方法一 chr(30).encode() 结果 方法二 struct.pack('B', 30) 结果 准确地讲,Python没有专门处理字节的数据类型.但由于str既 ...

  8. MVC、MVP 和 MVVM

    MVC Model–View–Controller 模型:管理应用程序的数据.逻辑和规则 视图:展示数据(可以直接从模型中获取数据) 控制器:接收输入并将其转化成模型和视图的命令 MVP Model– ...

  9. EDM邮件营销的七个重要参考指标

    如何做好EDM邮件营销,已经成为EDM工作人员面临的实际问题.当你发送邮件之前, 你可以先想想:我自己的电子邮件的目标是什么?邮件能否吸引收件人?能带来更多客户吗?无论你的目标是什么,以下的这些指标是 ...

  10. FireMonkey 绘图(1)

    FireMonkey 绘图(1) FMX 的 Canvas 在不同的系统上会分别使用:WinVista.Win7: D2D (FMX.Canvas.D2D.pas)WinXP: GDI+ (FMX.C ...