摘要
本文学习过程中记录
使用scrapy爬虫框架编写爬虫过程中,如果碰到大量的爬虫工作,将中间数据写入到数据库是不明智的,因为是频繁操作磁盘io导致效率下降,这时候应该把数据写入到redis中,提高效率的同时可以实现分布式爬虫。
scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能:
- scheduler:调度器
- dupefilter:URL去重规则(被调度器使用)
- pipeline:数据持久化
安装
1 | pip install scrapy-redis |
python操作redis
集合的基本操作
1 | import redis |
对列表的基本操作
- 左边插入,右边拿:队列
- 左边插入,左边拿:栈
- 没有数据拿的时候会夯住
1 | # 在列表的左边插入 |
有序集合
1 | # conn.zadd('score','a',60,'b',30,'c',90) |
scrapy-redis的三种队列
- 队列 SpiderQueue = FifoQueue
- 栈 SpiderStack = LifoQueue
- 优先级队列 SpiderPriorityQueue = PriorityQueue
- 默认使用优先级队列(默认广度优先),
- 其他:PriorityQueue(有序集合),
- FifoQueue(列表)(没有优先级,先进先出,广度优先)、
- LifoQueue(列表)(深度优先)
1 | # response.request.priority 优先级 |
梳理
scrapy中的去重规则
scrapy.dupefilter.RFPDupeFilter
scrapy-redis中的去重规则
scrapy_redis.dupefilter.RFPDupeFilter
scrapy中的调度器
scrapy.scheduler.Scheduler
- 将request对象全部放到内部维护的队列:self.q = deque()
- 将request对象全部放到硬盘维护的队列:文件操作
- 将request对象全部放到内部维护的队列:self.q = deque()
scrapy-redis中的调度器
scrapy_redis.scheduler.Scheduler
- 将请求通过pickle进行序列化,然后添加到redis的列表或者有序集合中
- SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.FifoQueue’
- 爬虫爬取数据时存在层级和优先级:爬虫中间件实现
使用scrpy-redis组件
- 只使用去重规则
- 连接redis
- DUPEFILTER_CLASS = ‘scrapy_redis.dupefilter.RFPDupeFilter’
- 只用调度器(一般不这么用)
- 去重规则使用默认的
- 去重+调度器(常用)
- 使用pipline做持久化,将item对象保存在redis的列表中
- 起始url不从start_urls里面取,从redis中取
URL去重
- 如果要扩展,自己写一个然后继承
1 | 定义去重规则(被调度器调用并应用) |
调度器
1 | """ |
数据持久化
定义持久化,爬虫yield Item对象时执行RedisPipeline
1 | # 将item持久化到redis时,指定key和序列化函数 |
起始URL相关
1 | # 获取起始URL时,去集合中获取还是去列表中获取?True,集合;False,列表 |
scrapy-redis示例
配置文件
1 | # DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" |