python分布式爬虫及数据存储_石帅/python爬虫分布式

简述

为什么使用分布式爬虫

我们平常使用scrapy框架进行爬虫时是使用的单机爬虫,意思也就是在本机一台机器上运行,分布式爬虫是实现多台机器共同完成一个爬虫,这样可以大大提高爬虫速度实现分布式爬虫

前提要领

在这里我们根据自己的思想来完成分布式,毕竟思想是灵活多变的 ,一样会使用redis数据库 为什么使用redis数据库

redis简单介绍

redis数据库优点:

1.支持多种数据类型

2.久化存储

3.丰富的特性 pub/sub,key过期策略,事务,支持多个DB等

4.由于是全内存操作 性能很好

redis数据库有五种数据类型

1.string字符串

2.list列表

3.set集合 无序收集器 ,与列表不同的是 列表可以存储多个相同的字符串 而集合保证自己存储的都是各不相同的

4.hash无序散列表 键值对 ,可以存储多个键值对之间的映射

5.zset有序集合,也是用来存储键值对 有序集合的键被称为成员(member) 每个成员都是不相同的 值被称为分值(score)

注意事项

配置服务器主从 这里我们使用两台机器来简单实现一下 一台为master端一台为worker端

master端开启redis服务 开启之后redis是可以后台运行的进程 还需master端要做的是运行一个爬虫脚本,是为了爬取要worker端爬虫要爬取的url(如果机器多的话,master端可以只用来做redis服务)

redis远程连接

找到配置文件redis.windows.conf

要注销第61行 #127.0.0.1 -->允许远程连接

80行修改 protected-mode no -->保护模式为否

219行修改stop-writes-on-bgsave-error 改为no -->解决不能持久化问题

worker端要做的是连接master端开启的redis服务,从redis库里面拿出url ,然后爬取这个url的内容

代码流程

连接redis

redis = redis.StrictRedis(host=’’, port=6379,decode_responses=True)

StrictRedis:Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。 简单说,官方推荐使用StrictRedis方法

decode_responses=True:这样写存的数据是字符串格式

master端配置

前面说过master端只是为了爬取worker端要爬取的url ,细心的朋友会发现到日志中出现了’md5值已存在’,是因为我们在pipelines设置了MD5去重的过程,这样 ,我们的worker端就不会在爬取已经爬取过的url了

为什么存储redis数据库时使用hash+list

if存储为列表时

1.master端爬取的url会存在重复的现象

2.worker端爬取url的内容后可以pop掉url(详情看worker端)

3.如果使用list删除url后 ,master端可能会再次爬到worker端跑的过url,这样数据依然会有重复的数据

if存储为集合时

1.不会存在重复的url ,这当然是有点 ,但是依然会存在存储为列表时第三种情况

所以使用hash+list的方法最合适不过了

不会爬取重复的url

pop后 ,在key为url_md5中依然存在爬取过的url转码后的MD5值

worker端可以充分利用时间来爬取新的url内容 ,大大节省了时间 , 提高了工作效率

master端跑完程序结束后 此时redis的状态

worker端配置

scrapy代码常规写法 , 只不过url咱们就在redis中取出即可

连接redis 后我用了一个无限循环的方法 当redis里面没有可以爬取的url时 退出循环

看看redis数据库的情况

日志中第一行为master端爬取的url转码后的MD5值 ,尽量不要动 ,因为万一下次master端再工作时爬取之前爬过的url呢 如果要清除的话redis.delete(‘url_md5’)即可

日志中第二行显示一个空列表 ,说明worker端工作完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值