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中的爬取队列删除,在重新爬取