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 ...
随机推荐
- [NOIP2017]注意点
1.数据大却没开long long 导致的gg.2.文件读入时stdin打成stdout...3.桶维护数值,有负值要平移,且数值最好稍大(否则可能RE).4.很智障地打错变量.5.DP或其他涉及到转 ...
- html初体验#2
碎碎念 关于布局 css布局:横向.纵向 2019年新进展:css grid git bash 上安装 http server 目的在于不使用 file:// 打开自己写的文件,使用 http:// ...
- Octavia 创建 Listener、Pool、Member、L7policy、L7 rule 与 Health Manager 的实现与分析
目录 文章目录 目录 创建 Listener 创建 Pool 创建 Member CalculateDelta HandleNetworkDeltas AmphoraePostNetworkPlug ...
- 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_7 Mybatis中使用代理Dao的执行过程分析
另外一种情况,不写Mybits的dao实现类的情况. 切换工程到CRUD的工程.这里面是不写dao实现类的方式 进入到GetMaper里面.这里是创建代理对象 去找SqlSession的实现类Defa ...
- log() exp()函数
1 对数函数表示法 import numpy as np import math print('输出自然底数e:',math.e) # np表示法 # np.log()是以e为底的自然对数 print ...
- jdk的keytool生成jks和获取jks的信息,公匙
1.生成jks.执行命令:keytool -genkeypair -alias mytest -keyalg RSA -keypass mypass -keystore mytest.jks -sto ...
- case when then else end 累加
表结构 id(pk) satisfy(满意,一般,不满意) 一条语句查询 总数 各satisfy总数 SELECT count(*) AS 总数, count( CASE satisfy WHEN ' ...
- numpy2
1.通用函数,是一种在ndarray数据中进行逐元素操作的函数.某些函数接受一个或多个标量数值,并产生一个或多个标量结果,通用函数就是对这些函数的封装. 1.常用的一元通用函数有:abs\fabs s ...
- vue-devtools安装以后,勾选了“允许访问文件网址”之后还是无法使用
勾选了“允许访问文件网址”,还是无法使用: Vue.js is detected on this page. Devtools inspection is not available because ...
- kafka producer发送消息 Failed to update metadata after问题
提示示例: ERROR Error when sending message to topic test with key: null, value: 2 bytes with error: Fail ...