如果采用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=1
如果出現爬取頁面url與請求url沖突,則可以設置settings下的配置:
SPIDER_MIDDLEWARES = { 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None, }
將crawlspider改寫為分布式爬蟲的實現:
from scrapy_redis.spiders import RedisCrawlSpider
首先導入分布式redis爬蟲類
1.首先將爬蟲文件的繼承類由 crawl spider改寫為RedisCrawlSpider
2.此時繼承類不在支持allowed_domains和start_urls這兩個配置參數,直接注釋掉
3.redis_key='當前類名:start_urls'替代start_urls,作為程序的啟動執行指令。
4.動態域范圍獲取的初始化方法,固定格式,且必須實現。
#動態域范圍獲取
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