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,一经查实,立即删除!

相关文章

[html] 写页面布局时需要考虑哪些方面的因素?

[html] 写页面布局时需要考虑哪些方面的因素? 1 熟练使用块级元素 和 行内元素 2 html 结构语义化 3 是否考虑兼容性 和 移动端个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与…

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

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

c#语言 修改xml文件路径,C#对XML操作:编辑XML文件内容-.NET教程,C#语言

public void page_load(object src,eventargs e){/** 版 权 : copyright by sem it department* 版 本 : version 0.0.1* 文 件 : editxml.aspx* 用 途 : 编辑xml文件(修改、删除行)* 作 者 : 欧阳云天 2005-4-9* 邮 箱…

创业

最近非常的忙。 9月10号需要给3个客户交付一套软件。而且公司也没什么人可以帮忙。大家都有自己的事情。只剩下不到一个月的时间了。还要兼顾测试。真的很担心。心情稍微好了些。有人帮忙了。 呵呵2009/8/25转载于:https://www.cnblogs.com/smallvv/archive/2009/08/17/1547927…

三星+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…

090817问题

问题编号:090817.UserControl 分类:用户控件 问题描述: 用户控件A功能描述:提交一组数据到服务器保存,成功保存地情况下呈现数据。控件上面至少存在一个button按钮,以及button单击事件。 页面需要罗列出已添…

[html] 你认为写出什么样的html代码才是好代码呢?

[html] 你认为写出什么样的html代码才是好代码呢? 但是发现是我自己写的时候。 我就知道,我的代码能力又上一层楼。 但是一个好的代码,不仅仅是逻辑顺序清楚,更重要还是复用性强,注释写的够让人明白。 其中最后一条尤…

添加系统路径

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

WCF演练源代码

/Files/litaocnblogs/LTWCF.rar转载于:https://www.cnblogs.com/litaocnblogs/archive/2009/08/20/1550669.html

android开机自动打开微信小程序,Android APP拉起小程序界面 (微信未启动 打不开)...

官方地址开发前需下载Android开发工具包(SDK),可前往下载调用接口:WXLaunchMiniProgram 移动应用跳转到小程序示例:String appId "wxd930ea5d5a258f4f"; // 填应用AppIdIWXAPI api WXAPIFactory.createWXAPI(context, appId);WXL…

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

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

[html] 如何使用H5实现电子签名?请说说你的思路

[html] 如何使用H5实现电子签名?请说说你的思路 最终目标;实现用户手写签名,然后将签名放到指定位置步骤: 1,使用canvas实现用户手写签名 2,canvas将用户签名导出图片 3,放到指定的dom处个人简…

Domain Socket本地进程间通信

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

php判断中英文请求,并实现跳转

PHP代码: <? $lan substr(?$HTTP_ACCEPT_LANGUAGE,0,5); if ($lan "zh-cn") print("<meta http-equivrefresh content 0;URL gb/index.htm>"); else print("<meta http-equivrefresh content 0;URL eng/index.htm>"); ?…

curl 请求日志_HTTP入门(一):在Bash中curl查看请求与响应

HTTP入门(一)&#xff1a;在Bash中curl查看请求与响应本文简单总结HTTP的请求与响应。本文主要目的是对学习内容进行总结以及方便日后查阅。详细教程和原理可以参考HTTP文档(MDN)。本文版权归马涛涛所有。本文所引用的图片和文字版权归原作者所有&#xff0c;侵权删。如有错误请…

下载android版趣步最新版,趣步下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...

程序需要调用以下重要权限&#xff1a;请求安装文件包- 允许程序请求安装文件包获取额外的位置信息提供程序命令- 允许程序访问额外的定位提供者指令修改或删除您的SD卡中的内容- 允许程序写入外部存储,如SD卡上写文件读取手机状态和身份- 访问电话状态读取您的SD卡中的内容- 允…

[html] 使用button当按钮和使用div当按钮有什么区别?

[html] 使用button当按钮和使用div当按钮有什么区别&#xff1f; button具有默认样式 button在表单中具有默认的提交事件 button具有disabled属性可以禁用个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨…

js基础---js组成以及基本认知

为什么要学js&#xff1f; 因为js无所不能&#xff0c;早期js是用来进行表单校验的&#xff1b;后来js误入歧途&#xff0c;用于实现小广告&#xff1b;再后来&#xff0c;ajax让js火了起来&#xff0c;可以实现无刷新更新数据&#xff0c;例如百度地图 也可以实现炫酷的网页特…

Virtools脚本语言(VSL)教程 - 枚举

enum关键字指定了一个枚举类型。枚举类型是一种用户定义的类型&#xff0c;由一套叫做计数器(enumerator)的赋之以名称的常量组成。缺省情况下&#xff0c;第一个计数器有一个为0的值&#xff0c;每个后续的计数器都比前一个的值更大(除非你显示地为特定计数器指定一个值)。 定…