下scrapy-redis如何为不同的爬虫项目分配不同的db,而不仅仅使用db0
2018-01-20 17:34
676 查看
背景
redis默认会生成16个db:db0 ~ db15, 在编写scrapy-redis分布式爬虫时,会默认使用db0来存放去重,种子队列以及item数据。但是一般情况下,我们不会只有一个爬虫项目,如果都放到一个数据库中,很容易搞混。所以为不同的爬虫项目分配不同的db是一件很有必要的事情。环境
系统:win7scrapy-redis
redis 3.0.5
python 3.6.1
分析
首先我们来分析一下scrapy-redis源码,看看设置db的位置在哪里?第一步: .\Lib\site-packages\scrapy_redis\scheduler.py
@classmethod def from_settings(cls, settings): kwargs = { 'persist': settings.getbool('SCHEDULER_PERSIST'), 'flush_on_start': settings.getbool('SCHEDULER_FLUSH_ON_START'), 'idle_before_close': settings.getint('SCHEDULER_IDLE_BEFORE_CLOSE'), } # If these values are missing, it means we want to use the defaults. optional = { # TODO: Use custom prefixes for this settings to note that are # specific to scrapy-redis. 'queue_key': 'SCHEDULER_QUEUE_KEY', 'queue_cls': 'SCHEDULER_QUEUE_CLASS', 'dupefilter_key': 'SCHEDULER_DUPEFILTER_KEY', # We use the default setting name to keep compatibility. 'dupefilter_cls': 'DUPEFILTER_CLASS', 'serializer': 'SCHEDULER_SERIALIZER', } for name, setting_name in optional.items(): val = settings.get(setting_name) if val: kwargs[name] = val # Support serializer as a path to a module. if isinstance(kwargs.get('serializer'), six.string_types): kwargs['serializer'] = importlib.import_module(kwargs['serializer']) # 初始化 redis server. server = connection.from_settings(settings) # Ensure the connection is working. server.ping() return cls(server=server, **kwargs)
会调用到 connection.py下的函数from_settings来初始化 Redis server
第二步: .\Lib\site-packages\scrapy_redis\connection.py
# Backwards compatible alias. from_settings = get_redis_from_settings def get_redis_from_settings(settings): """Returns a redis client instance from given Scrapy settings object. This function uses ``get_client`` to instantiate the client and uses ``defaults.REDIS_PARAMS`` global as defaults values for the parameters. You can override them using the ``REDIS_PARAMS`` setting. Parameters ---------- settings : Settings A scrapy settings object. See the supported settings below. Returns ------- server Redis client instance. Other Parameters ---------------- REDIS_URL : str, optional Server connection URL. REDIS_HOST : str, optional Server host. REDIS_PORT : str, optional Server port. REDIS_ENCODING : str, optional Data encoding. REDIS_PARAMS : dict, optional Additional client parameters. """ params = defaults.REDIS_PARAMS.copy() # 关键点就在这个位置,在这里,我们可以填入 redis自定义参数 params.update(settings.getdict('REDIS_PARAMS')) # XXX: Deprecate REDIS_* settings. for source, dest in SETTINGS_PARAMS_MAP.items(): val = settings.get(source) if val: params[dest] = val # Allow ``redis_cls`` to be a path to a class. if isinstance(params.get('redis_cls'), six.string_types): params['redis_cls'] = load_object(params['redis_cls']) return get_redis(**params)
如上述代码所示,会从settings的REDIS_PARAMS项中拿到参数,然后填入 get_redis(**params) 中,来初始化redis server,如下所示:
def get_redis(**kwargs): """Returns a redis client instance. Parameters ---------- redis_cls : class, optional Defaults to ``redis.StrictRedis``. url : str, optional If given, ``redis_cls.from_url`` is used to instantiate the class. **kwargs Extra parameters to be passed to the ``redis_cls`` class. Returns ------- server Redis client instance. """ redis_cls = kwargs.pop('redis_cls', defaults.REDIS_CLS) url = kwargs.pop('url', None) if url: return redis_cls.from_url(url, **kwargs) else: return redis_cls(**kwargs)
方法
通过上面的分析,做起来就很简单了,只要为爬虫配置好REDIS_PARAMS这个settings项就好了。 同理,设置password也是通过这种方式。
# 指定使用 db2 class MySpider(RedisSpider): """Spider that reads urls from redis queue (myspider:start_urls).""" name = 'xxxx' redis_key = 'xxxx:start_urls' # …… custom_settings = { 'LOG_LEVEL': 'DEBUG', 'DOWNLOAD_DELAY': 0, # 指定redis数据库的连接参数 'REDIS_HOST': '192.168.1.99', 'REDIS_PORT': 6379, # 指定 redis链接密码,和使用哪一个数据库 'REDIS_PARAMS' : { 'password': 'redisPasswordTest123456', 'db': 2 }, }
效果如下:
![输入图片说明](https://static.oschina.net/uploads/img/201801/20173306_QZcB.png "在这里输入图片标题") 注意事项: 在修改数据库之后,添加start_urls,以及从redis往mongodb进行数据转储时,需要指定对相应的数据库,如下:
创建redis数据库连接
rediscli = redis.Redis(host = redis_Host, port = 6379, db = "2")记录来自于Kosmoo:传送
相关文章推荐
- windows下scrapy-redis如何为不同的爬虫项目分配不同的db,而不仅仅使用db0
- 使用scrapy-redis实现分布式爬虫
- 使用scrapy,redis, mongodb实现的一个分布式网络爬虫
- 如何使用git命令提交项目到github并创建不同的版本控制
- (5)分布式下的爬虫Scrapy应该如何做-windows下的redis的安装与配置
- [置顶] [爬虫架构]使用scrapy-redis+multiprocessing构建超级爬虫
- 基于Python使用scrapy-redis框架实现分布式爬虫 注
- 项目中在Android.mk文件中根据项目名称选择不同的AndroidManifest.xml文件 && 如何使用系统设定的日期显示格式
- scrapy_redis只能使用redis的db0?
- [爬虫项目]scrapy使用ImagePipeline下载图片And图片分类存储(解决路径问题)
- python phontomjs爬虫项目 如何使用代理IP
- scrapy-redis所有request爬取完毕,如何解决爬虫空跑问题?
- 如何在一个机器上针对不同的项目需求使用不同的pyhon版本和包
- 如何在项目开发过程中使用Struts-menu
- 如何选择与使用项目经理
- Vss2005局域网开发权限设置指南(续)-如何利用VSS为项目小组的成员分配权限
- 项目初期不同职位的人如何沟通?以及沟通的效率
- 使用不同编程语言的混合项目基于VS2003
- 不同身份如何使用Trufun Kant Studio?