Python爬虫从入门到放弃(二十)之 Scrapy分布式原理
原文地址https://www.cnblogs.com/zhaof/p/7306374.html
關(guān)于Scrapy工作流程回顧
Scrapy單機(jī)架構(gòu)
上圖的架構(gòu)其實(shí)就是一種單機(jī)架構(gòu),只在本機(jī)維護(hù)一個(gè)爬取隊(duì)列,Scheduler進(jìn)行調(diào)度,而要實(shí)現(xiàn)多態(tài)服務(wù)器共同爬取數(shù)據(jù)關(guān)鍵就是共享爬取隊(duì)列。
?
這里重要的就是我的隊(duì)列通過什么維護(hù)?
這里一般我們通過Redis為維護(hù),Redis,非關(guān)系型數(shù)據(jù)庫,Key-Value形式存儲(chǔ),結(jié)構(gòu)靈活。
并且redis是內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),處理速度快,提供隊(duì)列集合等多種存儲(chǔ)結(jié)構(gòu),方便隊(duì)列維護(hù)
如何去重?
這里借助redis的集合,redis提供集合數(shù)據(jù)結(jié)構(gòu),在redis集合中存儲(chǔ)每個(gè)request的指紋
在向request隊(duì)列中加入Request前先驗(yàn)證這個(gè)Request的指紋是否已經(jīng)加入集合中。如果已經(jīng)存在則不添加到request隊(duì)列中,如果不存在,則將request加入到隊(duì)列并將指紋加入集合
如何防止中斷?如果某個(gè)slave因?yàn)樘厥庠蝈礄C(jī),如何解決?
這里是做了啟動(dòng)判斷,在每臺(tái)slave的Scrapy啟動(dòng)的時(shí)候都會(huì)判斷當(dāng)前redis request隊(duì)列是否為空
如果不為空,則從隊(duì)列中獲取下一個(gè)request執(zhí)行爬取。如果為空則重新開始爬取,第一臺(tái)叢集執(zhí)行爬取向隊(duì)列中添加request
如何實(shí)現(xiàn)上述這種架構(gòu)?
這里有一個(gè)scrapy-redis的庫,為我們提供了上述的這些功能
scrapy-redis改寫了Scrapy的調(diào)度器,隊(duì)列等組件,利用他可以方便的實(shí)現(xiàn)Scrapy分布式架構(gòu)
關(guān)于scrapy-redis的地址:https://github.com/rmax/scrapy-redis
搭建分布式爬蟲
參考官網(wǎng)地址:https://scrapy-redis.readthedocs.io/en/stable/
前提是要安裝scrapy_redis模塊:pip install scrapy_redis
這里的爬蟲代碼是用的之前寫過的爬取知乎用戶信息的爬蟲
修改該settings中的配置信息:
替換scrapy調(diào)度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
添加去重的class
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
添加pipeline
如果添加這行配置,每次爬取的數(shù)據(jù)也都會(huì)入到redis數(shù)據(jù)庫中,所以一般這里不做這個(gè)配置
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}
共享的爬取隊(duì)列,這里用需要redis的連接信息
這里的user:pass表示用戶名和密碼,如果沒有則為空就可以
REDIS_URL = 'redis://user:pass@hostname:9001'
設(shè)置為為True則不會(huì)清空redis里的dupefilter和requests隊(duì)列
這樣設(shè)置后指紋和請(qǐng)求隊(duì)列則會(huì)一直保存在redis數(shù)據(jù)庫中,默認(rèn)為False,一般不進(jìn)行設(shè)置
SCHEDULER_PERSIST = True
設(shè)置重啟爬蟲時(shí)是否清空爬取隊(duì)列
這樣每次重啟爬蟲都會(huì)清空指紋和請(qǐng)求隊(duì)列,一般設(shè)置為False
SCHEDULER_FLUSH_ON_START=True
分布式
將上述更改后的代碼拷貝的各個(gè)服務(wù)器,當(dāng)然關(guān)于數(shù)據(jù)庫這里可以在每個(gè)服務(wù)器上都安裝數(shù)據(jù),也可以共用一個(gè)數(shù)據(jù),我這里方面是連接的同一個(gè)mongodb數(shù)據(jù)庫,當(dāng)然各個(gè)服務(wù)器上也不能忘記:
所有的服務(wù)器都要安裝scrapy,scrapy_redis,pymongo
這樣運(yùn)行各個(gè)爬蟲程序啟動(dòng)后,在redis數(shù)據(jù)庫就可以看到如下內(nèi)容,dupefilter是指紋隊(duì)列,requests是請(qǐng)求隊(duì)列
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/111testing/p/10325428.html
總結(jié)
以上是生活随笔為你收集整理的Python爬虫从入门到放弃(二十)之 Scrapy分布式原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: falcon适配ldap密码同步
- 下一篇: python 多功能下载网页