九、scrapy_redis
1.分布式是什么?
简单的说,分布式就是不同的节点(服务器、ip不同)共同完成一个任务
2.scrapy_redis的概念
scrapy_redis是scrapy框架的基于redis的分布式组件
3.scrapy_redis的作用
通过持久化请求队列和请求的指纹集合来实现:
- 断点续爬
- 分布式快速爬取
4.scrapy_redis的工作流程
- 在scrapy_redis中,所有的待抓取的request的对象和去重的request对象指纹都存在所有的服务器公用的redis中
- 所有的服务器中的scrapy进程公用同一个redis中的request对象的队列
- 所有的request对象存入redis前,都会通过该redis中的request指纹集合进行判断,之前是否已经存入过
- 在默认的情况下所有的数据会保存在redis中
配置项:
- DUPEFILTER_CLASS 设置重复过滤器的模块
- SCHEDULER 设置调度器 scrapy_redis中的调度器具有与数据库交互的功能
- SCHEDULER_PERSIST 设置当爬虫结束的时候是否保持redis数据库中的去重集合与任务队列
- 设置redis数据库
- REDIS_URL = “redis://127.0.0.1:6379”
filter函数在python3中返回一个过滤器对象,在python2中返回一个列表
5.实现分布式爬虫
通过观察代码:
-
1.继承字父类RedisSpier
-
2.增加了一个redis_key的键,没有start_urls,因为分布式中,如果每一台电脑都请求一次start_url就会重复
-
3.多了一个__init__方法,该方法不是必须的,可以手动指定allow_domains
-
4.启动方法:
- 在每个节点正确的目录下执行scrapy crawl 爬虫名,使该节点的scrapy_redis爬虫程序就位
- 在共用的redis中,lpush redis_key ‘start_url’,使全部节点真正的开始运行
-
5.settings.py关键的配置
-
DUPEFILTER_CLASS = 'scrapy_redis.duperfilter.RFPDupefilter' SCHEDULER = 'scrapy_reds.scheduler.Scheduler' ScheDULER_PERSIST = True ITEM_PIPELINES = { ... 'scrapy_redis.pipelines.RedisPipeline':400, } REDIS_URL = "reds://127.0.0.1:6379"
-
-
小结:
-
1.scrapy_redis的含义和能够实现的功能
- scrapy是框架
- scrapy_redis是scrapy的组件
- scrapy_redis能够实现断点续爬和分布式爬虫
-
2.scrapy_reds流程和实现原理
- 在scrapy框架流程的基础上,把存储request对象放到了redis的有序集合中,利用该有序集合实现了请求队列
- 并对request对象生成指纹对象,也存储在同一redis的集合中,利用request指纹避免发送重复的请求
-
3.reqeust对象进入队列的条件
- request的指纹不在集合中
- request的dont_filter为True,即不过滤
-
4.reqeust指纹的实现
- 请求方法
- 排序后的请求地址
- 排序并处理过的请求体或空字符串
- 用hashlib.sha1()对以上内容进行加密
-
5.scrapy_redis实现增量式爬虫、分布爬虫
-
6.启动方式 scrapy runspider 爬虫文件名
分布式爬虫编写流程
- 1.先编写普通爬虫
- 创建项目
- 明确目标
- 创建爬虫
- 保存内容
- 2.改造成分布式爬虫
- 1.改造爬虫
- 1.导入scrapy_redis中的分布式爬虫类
- 2.继承爬虫类
- 3.注销start_url & allowed_domains
- 4.设置redis_key获取start_urls
- 5.设置__init获取允许的域
- 2.改造配置文件
- copy配置参数 5个
- 1.改造爬虫