1. 程式人生 > 其它 >scrapy-redis的搭建 分散式爬蟲 去重

scrapy-redis的搭建 分散式爬蟲 去重

master:
一、spider檔案
1.需要更改繼承的類
from scrapy_redis.spiders import RedisSpider

2.註釋掉start_urls

3.在爬蟲目錄下新建立一個redis_urls.py檔案,放所有的URL到redis資料庫的列表中

4.回到爬蟲檔案中,寫一個redis_key = '列表的key'

二.settings.py檔案

 1 #配置分散式的主要配置選項
 2 #1.配置排程器;
 3 SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
 4 #2.配置去重器
 5 DUPEFILTER_CLASS = '
scrapy_redis.dupefilter.RFPDupeFilter' 6 #3.配置排程佇列 7 SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.PriorityQueue' 8 #4.配置redis主機名 9 REDIS_HOST = 'localhost' 10 #5.配置redis埠號 11 REDIS_PORT = 6379


三.如果要解決scrapy-redis空跑問題
1.在專案目錄下,新建一個extensions.py檔案,寫如下程式碼:

 1 import logging
 2 
 3 from scrapy import signals
4 from scrapy.exceptions import NotConfigured 5 6 logging = logging.getLogger(__name__) 7 8 9 class RedisSpiderSmartIdleClosedExensions(object): 10 11 def __init__(self, idle_number, crawler): 12 self.crawler = crawler 13 self.idle_number = idle_number 14 self.idle_list = [] 15 self.idle_count = 0
16 17 @classmethod 18 def from_crawler(cls, crawler): 19 # first check if the extension should be enabled and raise 20 21 # NotConfigured otherwise 22 23 if not crawler.settings.getbool('MYEXT_ENABLED'): 24 raise NotConfigured 25 26 if not 'redis_key' in crawler.spidercls.__dict__.keys(): 27 raise NotConfigured('Only supports RedisSpider') 28 29 # get the number of items from settings 30 31 idle_number = crawler.settings.getint('IDLE_NUMBER', 360) 32 33 # instantiate the extension object 34 35 ext = cls(idle_number, crawler) 36 37 # connect the extension object to signals 38 39 crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened) 40 41 crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed) 42 43 crawler.signals.connect(ext.spider_idle, signal=signals.spider_idle) 44 45 return ext 46 47 def spider_opened(self, spider): 48 spider.logger.info("opened spider {}, Allow waiting time:{} second".format(spider.name, self.idle_number * 5)) 49 50 def spider_closed(self, spider): 51 spider.logger.info( 52 "closed spider {}, Waiting time exceeded {} second".format(spider.name, self.idle_number * 5)) 53 54 def spider_idle(self, spider): 55 # 程式啟動的時候會呼叫這個方法一次,之後每隔5秒再請求一次 56 # 當持續半個小時都沒有spider.redis_key,就關閉爬蟲 57 # 判斷是否存在 redis_key 58 if not spider.server.exists(spider.redis_key): 59 self.idle_count += 1 60 else: 61 self.idle_count = 0 62 63 if self.idle_count > self.idle_number: 64 # 執行關閉爬蟲操作 65 self.crawler.engine.close_spider(spider, 'Waiting time exceeded')

2.開啟settings.py檔案中EXTENSIONS的註釋,將Telent的註釋掉,換上:
'專案名.extensions.RedisSpiderSmartIdleClosedExensions': 500,


3.配置settings.py檔案:
# 開啟擴充套件
MYEXT_ENABLED = True
# 每5秒就檢測一次,檢測10次(50秒),如果url還為空,那麼就結束爬蟲程式
IDLE_NUMBER = 10


slave配置:
前面都一樣
需要刪除redis_urls檔案
settings.py的配置:

 1 #配置分散式的主要配置選項
 2 #1.配置排程器;
 3 SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
 4 #2.配置去重器
 5 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
 6 #3.配置排程佇列
 7 SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.PriorityQueue'
 8 #4.配置redis主機名
 9 REDIS_HOST = 'master的IP'
10 #5.配置redis埠號
11 REDIS_PORT = 6379
12 ITEM_PIPELINES = {
13 'meishi.pipelines.MeishiPipeline': 300,
14 # 'scrapy_redis.pipelines.RedisPipeline': 301
15 }

如果存到master的MongoDB資料庫,需要將host改成master的ip,資料庫改成master的,集合也改成master的

master端和slave端的程式碼保持一致(改完master端程式碼後複製一份當成salve端的程式碼),slave端需要更改以下:
1. redis_urls.py刪掉
2. MongoDB資料庫的主機號改為master端的

注意:scrapy-redis存在空跑問題


開始連線:
嘗試連線mongo:mongo --host masterIP --port 27017
嘗試連線master的redis資料庫:redis-cli -h masterIP
master的redis資料庫配置檔案需要做如下更改:
1.將bind 127.0.0.1 註釋掉
2.將protected-mode yes 改為 protected-mode no