若是採用redis數據庫集羣操做方式爬取數據源,那麼爬蟲客戶端最好設置redis數據庫的密碼,不然對方將沒法進行數據庫連接操做,而且會報未知錯誤。redis
redis-cli -h 192.168.1.53 -p 6379 -a 12345 (依次是 目標主機地址,端口號,對方數據庫密碼) 如此能確保集羣的正常拼通數據庫
若是執行分佈式爬取操做:lpush readspider:start_urls https://www.qidian.com/allorderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=1dom
若是出現爬取頁面url與請求url衝突,則能夠設置settings下的配置:scrapy
SPIDER_MIDDLEWARES = { 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None, }
將crawlspider改寫爲分佈式爬蟲的實現:分佈式
from scrapy_redis.spiders import RedisCrawlSpider
首先導入分佈式redis爬蟲類ide
1.首先將爬蟲文件的繼承類由 crawl spider改寫爲RedisCrawlSpiderurl
2.此時繼承類不在支持allowed_domains和start_urls這兩個配置參數,直接註釋掉spa
3.redis_key='當前類名:start_urls'替代start_urls,做爲程序的啓動執行指令。code
4.動態域範圍獲取的初始化方法,固定格式,且必須實現。server
#動態域範圍獲取
def __init__(self,*args,**kwargs): domain=kwargs.pop('domain','') self.allowed_domains=filter(None,domain.split(',')) super(ReadSpider,self).__init__(*args,**kwargs)
爬蟲文件修改完成,對配置文件settings進行設置:
# 使用scrapy-redis裏的去重組件,不使用scrapy默認的去重方式
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis裏的調度器組件,不使用默認的調度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 容許暫停,redis請求記錄不丟失
SCHEDULER_PERSIST = True # 默認的scrapy-redis請求隊列形式(按優先級)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 隊列形式,請求先進先出 #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue" # 棧形式,請求先進後出 #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
# LOG_LEVEL = 'DEBUG'
在settings裏指定數據庫的配置:
# 指定數據庫的主機IP
REDIS_HOST = "127.0.0.1"
# 指定數據庫的端口號
REDIS_PORT = 6379
#數據庫密碼
REDIS_PARAMS = {'password': '123456'}
最好默認就將上文提到的spider_middlewares中間件開啓,並安上述配置爲None
SPIDER_MIDDLEWARES = { 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None, }
最後在管道文件添加scrapy_redis的管道類
ITEM_PIPELINES = { 'qd.pipelines.QdPipeline': 300, 'scrapy_redis.pipelines.RedisPipeline': 400, }
至此爬蟲修改完成。
執行流程:進入當前項目的爬蟲文件目錄下,執行 scrapy runspider read.py
爬蟲將被喚醒,處於阻塞狀態,監聽指定數據庫的IP和端口,
redis數據庫發送指令:
lpush readspider:start_urls https://www.qidian.com/allorderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=1
爬蟲啓動,開始採集數據。
*************************************************************************************
若是想實現兩臺或者多臺計算機的分佈式爬蟲策略:
若客戶端尚未爬蟲項目,且爬蟲項目已經在其餘主機上開發完成,則能夠直接遠程推送給客戶端。
1.將爬蟲項目打成tar包 :tar -cvf qidian.tar.gz qidian qidian.tar
2.鏈接至客戶端:sftp 用戶名@IP地址 -----> sftp lisa@192.168.1.53
3.輸入客戶端用戶的密碼,鏈接成功
4. ls查看客戶端下當前目錄,lls查看本機所在目錄。
5.發包到客戶端 put qidian.tar
6.客戶端解包項目:tar -xvf qidian.tar
那麼客戶端就能夠部署項目了,部署時一定要更改爲當前redis的IP和端口
關於redis數據庫服務:如果沒有關閉遠程保護,會禁止客戶端的遠程鏈接:在redis server xxx.cfg配置文件裏
將protected-mode
配置項設爲no
,注意 要在配置文件中修改,若直接在客戶端中經過config set protected-mode no
命令修改,只對本次有效,redis-server
重啓後,仍是爲yes