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 itemdef 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 itemdef 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 的存储,其他大同小异,以后有机会再更新。

转载于:https://www.cnblogs.com/yanshw/p/10919052.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地壳中元素含量排名记忆口诀_广州地化所等发现洋内弧大陆地壳成熟新机制

大陆的形成和演化是地球科学研究中广泛关注的前沿科学问题之一。大陆地壳总体上具有安山质到英安质地球化学成分特征,与洋内弧中大洋俯冲作用形成的岩浆岩具有相似的微量元素地球化学特征(如富集大离子亲石元素和亏损高场强元素),众多学者认为大陆地壳的…

三星+android7.0+字体,三星S7升级安卓7.0新技能:新增分辨率调整功能

三星Galaxy Note 7推出了安卓7.0的升级,此次升级后,三星S7将会增加分辨率调整功能。这个功能可以根据用户的需求和喜好来进行调整,在HD(7201280像素)、FHD(12801920像素)以及QHD(14402560像素)三种不同的分辨率之间自由切换。在过去的一年里&…

html title属性无效_【学习教程】使用JavaScript删除CSS属性

方法1:使用CSS removeProperty:该CSSStyleDeclaration.removeProperty()方法被用来从一个元件的样式删除一个属性。通过遍历styleSheets数组并选择cssRule,可以选择元素的样式。然后可以使用要删除的属性指定removeProperty方法。句法&#x…

添加系统路径

export PATH$PATH:/usr/local/mongodb/bin/ source /etc/profile 转载于:https://www.cnblogs.com/xiaobiaomei/p/10922225.html

7怎样设置禁网_怎样才能提升网站内页的收录?

1、提高网站的内容质量,文章尽可能的原创。搜索引擎蜘蛛更喜爱原创的高质量内容,能够缩短网站的审核期。2、良好的网站结构,继续搜索引擎的匍匐与抓取。现在一般都是divcss的结构,不要运用table结构,尽可能少的运用fla…

Domain Socket本地进程间通信

socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有…

入门指南_激光切管快速入门指南

本文是有关管材和激光管切割的思考的快速入门指南。要求首先,需要确定对管材尺寸的要求。考虑以下问题:将要加工的管材最大和最小直径是多少?切割这些管材需要多大功率?它们是薄壁还是厚壁?原材料和成品零件的长度是多…

页面调试

1.network all 所有请求 XHR ajax请求 WS websocket请求 转载于:https://www.cnblogs.com/gzl180110/p/10930802.html

hexo 环境变量_小白使用 Github + Hexo 从 0 搭建一个博客

最近有几位同学在公众号后台留言问我的博客站是怎么建站的,思来想去,还是写一篇从 0 开始吧。前置准备我们先聊一下前置准备,可能很多同学一听说要自己搭一个博客系统,直接就望而却步。不得有台服务器么,不得搞个数据库…

android service交互,Android Activity与Service的交互方式

参考: http://blog.csdn.net/gebitan505/article/details/18151203实现更新下载进度的功能1. 通过广播交互Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度…

[转帖]AjaxControlToolkit.TabContainer 自定义样式续

Tabs控件其实是一个容器控件TabContainer和面板控件TabPanel。TabContainer控件用于包含TabPanel。TabPanel控件用于显示。下面来看一个示例:1)在VS2005中新建一个ASP.NET AJAX-Enabled Web Project项目工程,命名为Tabs。2)在Default.aspx页面上添加一个…

c++ using 前置声明_每日优鲜前置仓模式的配货优化方案案例介绍

大渔导读:2019 年零售业供应链最佳实践大奖——银奖 基于每日优鲜前置仓模式的配货优化方案案例;1. 背景介绍: 每日优鲜成立于 2014 年 11 月,是专注于优质生鲜的移动电商,已在北上广深等全国 10 个核心城市建立“城市…

lg gw880 qq2011 android beta4版,LG GW880评测:CMMB天线、细节设计

机身侧面的银色边框与黑色的正面形成了鲜明的对比。不同于大部分的手机,LG GW880把电源/锁机键放到了机身左侧,而且还多了一个返回键,所以机身侧面设置了比较多的按键,设计比较复杂。机身右侧是拍照键、音量键以及数据线接口&…

excel按季度分类汇总_Excel数据分析实战(1)--电商销售记录分析

Excel是市面上最流行的办公软件之一,也是数据分析师入门最好的学习工具。因为其功能强大、操作简单,可以快速对数据进行清洗,建模,可视化,操作者不需要其他计算机基础也能快速上手。所以选择Excel进行数据分析入门的项…

[Silverlight]奇技银巧系列-2

Silverlight奇技银巧系列: 所有该系列中的文章只为介绍一些Silverlight中或隐藏在Silverlight .NET framework鲜为人知的知识和技巧。这些文章并非教程,也是不是什么技术指导,您只需对文章介绍的内容保有印象。这些知识和技巧也许会在不经意间…

好程序员Java分享Java案例_英汉字典

在写代码的时候,当鼠标悬浮在某一个单词上面的时候,有道词典点有时会弹出一个消息气泡,在里面中给出关于这个单词相关的解释,下面给大家展示一个使用Java基础语言编写的英汉字典案例:   实现功能: …

同事更新几个表_最近计划学习的几个网站资源

在没有明确需要的时候逛知乎,B站什么的随便看教程,发现资源很多,五花八门,但是总也没系统地学习一下。一会儿看一小段,转眼就忘光了,只留下一个刚才我没有在玩耍的错觉。以上是无关紧要的忏悔。接下来主要记…

带有托管代码的InfoPath2007表单模版发布到SharePoint表单库(浏览器方式查看)

在本篇文章中,将与大家分享如何将一个带有托管代码(manage code)的InfoPath2007表单模版发布到SharePoint Server2007的表单库中,并使得最终用户可以通过浏览器方式访问。 1. 创建InfoPath表单模版 在这里,我们使用VSTO2005与InfoPath2007。生成…

cefsharp System.IO.FileNotFoundException: 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项。...

解决办法 安装vc 2015 Redistributable 64位系统安装x64 如果还报错先装x64版本再装x86版本 https://files.cnblogs.com/files/xuejianxiyang/vc_redist.part1.rarhttps://files.cnblogs.com/files/xuejianxiyang/vc_redist.part2.rarhttps://files.cnblogs.com/files/xuejianx…

7种常用p2p共享协议

一、Napster:第一个大型的;中央集中式;倒闭了;二、Gnutella和Gnutella2:开源的;第一个真正非中心的。Gnutella2是对Gnutella的改进和扩展。三、FastTrack:第一个客户端是KazaA。协议与Gnutella类…