基于scrapy-redis的分布式爬虫简单使用

1.准备工作

1.多台主机(两台及以上),且均安装scrapy和scrapy-redis并正常运行,主机之间能互相访问
2.代理池和账号池的搭建(非必须)

2.连接redis

1.按照redis库
2.使用代码验证redis能否正常连接

from redis import StricRedis
res = StricRedis(host='192.168.1.1', port=6379)  # redis默认运行在6379端口上
print(res.ping())  # 返回True代表正常,否则报错

如果报错了,检查IP(傻瓜式错误,偏偏很多人就是犯这个错),防火墙,安全组,以及redis配置文件
注:修改redis配置文件里的bind,将127.0.0.1修改为0.0.0.0
在这里插入图片描述

3.代理池和账号池

另一篇文章写怎么搭建代理池和账号池

4.配置scrapy-redis

1.在setting,py里面添加调度器的类和去重的类

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

2.配置redis

最简单的方法就是在setting,py里面直接配置REDIS_URL就可以

REDIS_URL = 'redis://192.168.1.1:6379'

3.配置调度队列(可选)

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'

如果不做配置。默认PriorityQueue
注:PriorityQueue使用有序集合来存储,在这个集合中,每个元素都有个分数,这个分数就代表优先级,优先级高的先调用。FifoQueue代表请求先进先出,LifoQueue代表请求后进先出。

4.scrapy持久化(可选)

scrapy-redis默认爬取完成后清空爬取队列和去重指纹集合
如果不想自动清空,添加如下配置

SCHEDULER_PERSIST = True

5.scrapy重爬(可选)

如果配置了scrapy持久化,那么强行中断爬虫,爬起队列不会被清空,重新启动爬虫会接着上次爬取,如果我们想重新爬取,添加重爬配置

SCHEDULER_FLUSH_ON_START = True

6.运行

保证多台主机上的代码是一致的,这样多台主机就共享同一个redis爬取队列,从而完成协同爬取

在每台主机上启动爬虫,不分先后顺序,第一个启动的爬取检测爬取队列为空,会将获取的request请求添加到爬取队列中,后续启动的爬虫检测到爬取队列,直接从爬取队列中获取request进行调用,这样就实现了多个爬虫同时爬取。

注:如果中间想中断爬虫并且重新爬取,需要手动把redis中的爬取队列删除,在重新爬取

你可能感兴趣的:(redis,scrapy,分布式)