Scrapy 教程(十)-管道与数据库
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 教程(十)-管道与数据库的更多相关文章
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十(导出对象结构)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two]
无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two] extjs技术交流,欢迎加群(201926085) 不管是几级下拉列表的联动实现本质上都是根据某个下拉列表的变化,去动态加载其 ...
- Unity3D脚本中文系列教程(十六)
Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆ function OnPostprocess ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block 到目前为止,我们使用的模块都是在同一个配置 ...
- [转]PostgreSQL教程(十六):系统视图详解
这篇文章主要介绍了PostgreSQL教程(十六):系统视图详解,本文讲解了pg_tables.pg_indexes.pg_views.pg_user.pg_roles.pg_rules.pg_set ...
- Python爬虫框架Scrapy教程(1)—入门
最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...
- Scrapy教程
Scrapy教程 原文地址https://doc.scrapy.org/en/latest/intro/tutorial.html 此教程我们假设你已经装好了Scrapy,如果没有请查看安装指南.. ...
- RabbitMQ入门教程(十四):RabbitMQ单机集群搭建
原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
随机推荐
- sudo: pip:command not found问题解决
python3 sudo apt-get install python3-pip python2 sudo apt-get install python-pip如果还是不行,则按照下面操作 原因:编译 ...
- GO语言学习笔记2-int类型的取值范围
相比于C/C++语言的int类型,GO语言提供了多种int类型可供选择,有int8.int16.int32.int64.int.uint8.uint16.uint32.uint64.uint. 1.i ...
- jquery eq()选择器 语法
jquery eq()选择器 语法 作用::eq() 选择器选取带有指定 index 值的元素.index 值从 0 开始,所有第一个元素的 index 值是 0(不是 1).经常与其他元素/选择器一 ...
- luoguP1255 数楼梯 x
P1255 数楼梯 题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入输出格式 输入格式: 一个数字,楼梯数. 输出格式: 走的方式几种. 输入 ...
- linux的yum命令
linux yum 命令 yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指 ...
- Linux基本命令使用(一)
1.head -n 文件 可以查看文件前n行 tail -n 文件 可以查看文件的后n行 tail -f 文件 可以实时查看文件,比如日志在更新,就可以实时显示最后几行 ...
- Spring Data Jpa (三)定义查询方法
本章详细讲解如何利用方法名定义查询方法(Defining Query Methods) (1)定义查询方法的配置方法 由于Spring JPA Repository的实现原理是采用动态代理的机制,所以 ...
- 2-sat问题简记
关于2-sat问题,这里笔者主要是做一些简记,如要详细了解,可以读一读此dalao的文章:https://blog.csdn.net/jarjingx/article/details/8521690 ...
- 探究代码审查(Code review)
Code review 是什么 对软件源代码的系统性检查,查找软件源代码质量,结构,漏洞等问题. PS:Code review ≍ Code inspections ≥ Code walkthrou ...
- (转载)FM 算法
(转载)FM算法 https://zhuanlan.zhihu.com/p/33184179