scrapy_redis只能使用redis的db0?

本文介绍了一种在Scrapy-Redis中指定使用特定Redis DB的方法,通过自定义Scheduler类来实现,避免直接修改模块源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

众所周知,Redis默认的配置会生成db0~db15共16个db,切分出16个db的一个作用是方便不同项目使用不同的db,防止的数据混淆,也为了方便数据查看。
Python在连接Redis时如果没有指定用哪一个db则默认使用db0。使用过scrapy_redis模块的同学也知道去重和种子队列都在db0上。

现在有一个基于scrapy、Redis的分布式爬虫,是从同事那边接手过来的。原先没觉得scrapy_redis使用db2来存放request和dupefilter有什么难度,也就没在意他的代码是怎么实现的了,只知道他的爬虫将种子和去重都放在了db2。昨天添加功能改代码,将代码从服务器拷贝出来跑测试,发现数据是存放在db0中的。仔细看了代码,没发现哪里改成了db2,但服务器上跑为什么会把数据存到db2呢?一样的代码,保存的地方竟然不一样?大惑!

半信半疑地去看了一下服务器中scrapy_redis的源码,发现connection.py中连Redis的代码竟然被改了!
scrapy_redis/connection.py
也是有点醉!直接改python模块的源代码是大忌!虽然这样改简单快捷,但是模块是公用的代码,如果其他项目也要用到这个项目的话就乱了,而且也不利于本项目代码的迁移,与饮鸩止渴无差。

然后看了scrapy_redis模块的源码,发现scrapy_redis在连接Redis时并没有指定db,默认db0。并没有接口让用户指定db。那么问题来了,scrapy_redis想要使用redis的db2,该怎么做?



解决:

1、同事那个改法就很简单快捷(如上方图片),但是不能直接改模块源码,要把源码复制一份出来,放在项目目录下,然后进行修改。项目调用scrapy_redis时也是调用本目录下的scrapy_redis。

2、第二种是用继承。见上方的图片,代码的作用是实例化生成一个redis连接对象,一般情况下是返回redis.Redis()对象。这个方法被scheduler.py下的from_settings()方法调用。代码如下:
这里写图片描述
我们可以继承这个方法,再来个偷梁换柱。
具体方法:在settings.py同级目录下新建一个文件schedulerOverwrite.py,填入下面的代码。然后在settings.py设置SCHEDULER=schedulerOverwrite.SchedulerSon,之后在settings.py中设置REDIS_DB=XXX即可指定db。

import redis
from scrapy_redis.scheduler import Scheduler
from scrapy.utils.misc import load_object

# default values
SCHEDULER_PERSIST = False
QUEUE_KEY = '%(spider)s:requests'
QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
DUPEFILTER_KEY = '%(spider)s:dupefilter'
IDLE_BEFORE_CLOSE = 0

REDIS_URL = None
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_DB = 0


def from_settings(settings):
    url = settings.get('REDIS_URL', REDIS_URL)
    host = settings.get('REDIS_HOST', REDIS_HOST)
    port = settings.get('REDIS_PORT', REDIS_PORT)
    db = settings.get('REDIS_DB', REDIS_DB)

    # REDIS_URL takes precedence over host/port specification.
    if url:
        return redis.from_url(url)
    else:
        return redis.Redis(host=host, port=port, db=db)


class SchedulerSon(Scheduler):
    @classmethod
    def from_settings(cls, settings):
        persist = settings.get('SCHEDULER_PERSIST', SCHEDULER_PERSIST)
        queue_key = settings.get('SCHEDULER_QUEUE_KEY', QUEUE_KEY)
        queue_cls = load_object(settings.get('SCHEDULER_QUEUE_CLASS', QUEUE_CLASS))
        dupefilter_key = settings.get('DUPEFILTER_KEY', DUPEFILTER_KEY)
        idle_before_close = settings.get('SCHEDULER_IDLE_BEFORE_CLOSE', IDLE_BEFORE_CLOSE)
        server = from_settings(settings)
        return cls(server, persist, queue_key, queue_cls, dupefilter_key, idle_before_close)



转载请注明出处,谢谢!(原文链接:http://blog.youkuaiyun.com/bone_ace/article/details/54139500

Scrapy-Redis是一个用于Scrapy爬虫的数据持久化中间件,它可以利用Redis作为数据存储和去重的解决方案。要在Scrapy项目中配置Redis的去重机制,你需要按照以下步骤操作: 1. **安装scrapy-redis**: 在你的Scrapy项目目录中运行命令: ``` pip install scrapy_redis ``` 2. **添加中间件到settings.py**: 在`settings.py`文件中,确保已经包含了`scrapy_redis`的相关设置,并启用它。例如: ```python DOWNLOADER_MIDDLEWARES = { 'scrapy_redis.middleware.RedisMiddleware': 700, # 其他中间件... } ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300, } REDIS_PARAMS = { 'host': 'localhost', # Redis服务器地址,默认为localhost 'port': 6379, # Redis端口,默认为6379 'db': 0, # 数据库索引,一般选择0 'password': '', # 如果有密码,此处填入 } ``` 3. **启用去重功能**: 要启用去重,你需要开启RedisMiddleware,并设置相应的去重策略。可以选择`DUPEFILTER_CLASS`来指定去重规则。例如,使用简单的哈希去重: ```python DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" ``` 或者使用更复杂的基于请求的去重(如避免爬取相同的URL): ```python REDIS_KEY_PREFIX = 'your_prefix_' # 自定义Redis键前缀 ``` 4. **启动Redis客户端**: 确保你的Redis服务正在运行。如果没有,可以使用命令行启动本地Redis服务: ``` redis-server ``` 完成上述设置后,Scrapy-Redis会自动将请求ID、响应体等信息存入Redis,并通过哈希或自定义键进行去重处理。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值