8.Redis分布式
原生scrapy不支持分布式,不适合大型开发。
安装redis数据库,然后pip install scrapy_redis安装对应的库,可基于redis实现分布式功能。
redis数据库简介
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis是非关系数据库。
Redis是轻量型内存数据库,有限的数据类型,简洁的读写API,运行后不经过磁盘IO,读写迅速,远程增删改查非常容易。既可用于对临时性、经常变动的数据的缓存,也可用于执行分布式任务。
在这里,需要在linux系统中安装redis数据库(master机器,yum install redis),并安装对应的python库(可选,pip install redis)。
scrapy_redis库
scrapy_redis主要内容:
1.不必额外连接redis数据库,只需在配置文件里进行配置,爬虫启动时自动连接redis数据库并自动读取url数据生成请求队列。
2.实现了基于redis数据库以及适用于分布式的Spider基础类。
3.实现了基于redis数据库以及适用于分布式的Scheduler(调度器)、RFPDupeFilter(去重)、PriorityQueue(优先级队列)等,即重写了scrapy框架的核心类。
4.提供了RedisPipeline,可自动将爬取及解析得到的item存到redis数据库里。
默认配置:
scrapy_redis/defaults.py:
# For standalone use.
DUPEFILTER_KEY = 'dupefilter:%(timestamp)s'
PIPELINE_KEY = '%(spider)s:items'
REDIS_CLS = redis.StrictRedis
REDIS_ENCODING = 'utf-8'
# Sane connection defaults.
REDIS_PARAMS = {
'socket_timeout': 30,
'socket_connect_timeout': 30,
'retry_on_timeout': True,
'encoding': REDIS_ENCODING,
}
SCHEDULER_QUEUE_KEY = '%(spider)s:requests'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'
SCHEDULER_DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
START_URLS_KEY = '%(name)s:start_urls'
START_URLS_AS_SET = False
分布式爬虫架构
需要定义一个Master主服务器,用于运行redis数据库,把所有的爬取任务集中统一管理。所有的爬虫实例均视作Slave。
相关配置
在爬虫工程的配置文件里修改或添加一些项:
yourproject/settings.py:
SCHEDULER = "scrapy_redis.scheduler.Scheduler"#基于redis的调度器
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#基于redis的url去重类
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'#基于redis的优先级队列
SCHEDULER_PERSIST = True