盡人皆知,Redis默許的配置會生成db0~db15共16個db,切分出16個db的1個作用是方便不同項目使用不同的db,避免的數據混淆,也為了方便數據查看。
Python在連接Redis時如果沒有指定用哪個db則默許使用db0。使用過scrapy_redis模塊的同學也知道去重和種子隊列都在db0上。
現在有1個基于scrapy、Redis的散布式爬蟲,是從同事那邊接手過來的。本來沒覺得scrapy_redis使用db2來寄存request和dupefilter有甚么難度,也就沒在乎他的代碼是怎樣實現的了,只知道他的爬蟲將種子和去重都放在了db2。昨天添加功能改代碼,將代碼從服務器拷貝出來跑測試,發現數據是寄存在db0中的。仔細看了代碼,沒發現哪里改成了db2,但服務器上跑為何會把數據存到db2呢?1樣的代碼,保存的地方居然不1樣?大惑!
半信半疑地去看了1下服務器中scrapy_redis的源碼,發現connection.py中連Redis的代碼居然被改了!
也是有點醉!直接改python模塊的源代碼是大忌!雖然這樣改簡單快捷,但是模塊是公用的代碼,如果其他項目也要用到這個項目的話就亂了,而且也不利于本項目代碼的遷移,與飲鴆止渴無差。
然后看了scrapy_redis模塊的源碼,發現scrapy_redis在連接Redis時并沒有指定db,默許db0。并沒有接口讓用戶指定db。那末問題來了,scrapy_redis想要使用redis的db2,該怎樣做?
1、同事那個改法就很簡單快捷(如上方圖片),但是不能直接改模塊源碼,要把源碼復制1份出來,放在項目目錄下,然落后行修改。項目調用scrapy_redis時也是調用本目錄下的scrapy_redis。
2、第2種是用繼承。見上方的圖片,代碼的作用是實例化生成1個redis連接對象,1般情況下是返回redis.Redis()對象。這個方法被scheduler.py下的from_settings()
方法調用。代碼以下:
我們可以繼承這個方法,再來個移花接木。
具體方法:在settings.py同級目錄下新建1個文件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)
轉載請注明出處,謝謝?。ㄔ逆溄樱篽ttp://blog.csdn.net/bone_ace/article/details/54139500)
下一篇 git tag