(1)概念: scrapy_redis是scrapy框架的基于redis的分布式组件【不同的节点(服务器,ip不同)共同完成一个任务】
(2)作用: ①断点续爬、②分布式快速抓取
(3)原理:
步骤:
①每个服务器从公用redis中抢占起始url请求
②抢到起始url的服务器将请求交给调度器
③调度器再将起始url请求放进任务队列中,各个服务器的调度器从任务队列中抢占起始url请求
④抢到的调度器将该起始url请求交给下载器,返回响应给爬虫
- 解析出新的url再交给调度器,调度器将新解析出来的url放到过滤集合中对比过滤,之前没有放进过集合的将被放到任务队列,继续重复③和④
- 解析出来的数据统一交给公用redis中的数据队列
(1)安装scrapy_redis模块
pip3 install scrapy_redis -i https://pypi.douban.com/simple/
(2)下载demo代码:
clone github scrapy-redis源码文件 :
git clone https://github.com/rolando/scrapy-redis.git
(3)打开example-project爬虫文件dmoz
①可以看到这个爬虫文件使用crawlspider模块
②修改允许域名和起始URL
allowed_domains = ['dmoztools.net']
start_urls = ['http://www.dmoztools.net/']
(4)添加redis数据库配置
REDIS_URL = "redis://192.168.220.151:6379"
(5)开启爬虫:scrapy crawl dmoz
(6)查询数据库: 可以利用redis可视化软件RedisDesktopManager查看
(7)中止进程后再次运行dmoz爬虫,程序在前一次的基础之上继续往后执行
(8)原理分析
①分析setting文件的配置信息
②Scrapy_redis之RedisPipeline管道类:进行数据的保存,存入了redis中
③ Scrapy_redis之RFPDupeFilter去重类:实现了对request对象的加密
④Scrapy_redis之Scheduler调度器类:决定什么时候把request对象加入带抓取的队列,同时把请求过的request对象过滤掉
(1)打开example-project爬虫文件myspider_redis.py
区别于原来的爬虫类:
①将起始url放到了redis_key
②在__init__方法中动态获取可允许的域名
(2)settings文件的关键配置
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"
(3)运行
步骤①:在每个节点正确的目录下执行scrapy crawl 爬虫名,使该节点的scrapy_redis爬虫程序就位
步骤②:在共用的redis中 lpush redis_key ‘start_url’,使全部节点真正的开始运行
(4)编写流程
1)先用普通爬虫的方法编写
2)改造成分布式爬虫
①改造爬虫文件
导入scrapy_redis中的分布式爬虫类——继承类——注销start_url和allow_domains——设置redis_key注册start_url——设置__init__方法获取allow_domains
②改造配置文件
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"