柚子快報(bào)激活碼778899分享:爬蟲的分布式思維與實(shí)現(xiàn)思路
柚子快報(bào)激活碼778899分享:爬蟲的分布式思維與實(shí)現(xiàn)思路
爬蟲的分布式思維與實(shí)現(xiàn)思路
基本構(gòu)架
scrapy-redis實(shí)現(xiàn)分布式,其實(shí)從原理上來說很簡單,這里為描述方便,我們把自己的核心服務(wù)器稱為master,而把用于跑爬蟲程序的機(jī)器稱為slave
我們知道,采用scrapy框架抓取網(wǎng)頁,我們需要首先給定它一些start_urls,爬蟲首先訪問start_urls里面的url,再根據(jù)我們的具體邏輯,對里面的元素、或者是其他的二級、三級頁面進(jìn)行抓取。而要實(shí)現(xiàn)分布式,我們只需要在這個starts_urls里面做文章就行了
我們在master上搭建一個redis數(shù)據(jù)庫(注意這個數(shù)據(jù)庫只用作url的存儲),并對每一個需要爬取的網(wǎng)站類型,都開辟一個單獨(dú)的列表字段。通過設(shè)置slave上scrapy-redis獲取url的地址為master地址。這樣的結(jié)果就是,盡管有多個slave,然而大家獲取url的地方只有一個,那就是服務(wù)器master上的redis數(shù)據(jù)庫
并且,由于scrapy-redis自身的隊(duì)列機(jī)制,slave獲取的鏈接不會相互沖突。這樣各個slave在完成抓取任務(wù)之后,再把獲取的結(jié)果匯總到服務(wù)器上
好處
程序移植性強(qiáng),只要處理好路徑問題,把slave上的程序移植到另一臺機(jī)器上運(yùn)行,基本上就是復(fù)制粘貼的事情
分布式爬蟲思路
任務(wù)分發(fā)和調(diào)度:需要一個中心節(jié)點(diǎn)或者調(diào)度器來分發(fā)任務(wù)給各個爬蟲節(jié)點(diǎn),并監(jiān)控任務(wù)的執(zhí)行情況??梢允褂孟㈥?duì)列(如RabbitMQ、Kafka)或分布式任務(wù)調(diào)度框架(如Celery)來實(shí)現(xiàn)任務(wù)的分發(fā)和調(diào)度。 數(shù)據(jù)存儲和去重:在分布式環(huán)境下,需要統(tǒng)一管理爬取的數(shù)據(jù),并進(jìn)行數(shù)據(jù)去重。可以使用分布式數(shù)據(jù)庫(如MongoDB、Cassandra)或者分布式存儲系統(tǒng)(如Hadoop HDFS)來存儲數(shù)據(jù),并使用分布式去重算法(如布隆過濾器)來進(jìn)行數(shù)據(jù)去重。 URL管理:在分布式環(huán)境下,需要管理待爬取的URL隊(duì)列,并保證每個URL只被爬取一次。可以使用分布式隊(duì)列(如Redis隊(duì)列)來管理URL隊(duì)列,并使用分布式鎖來保證URL的唯一性。 爬蟲節(jié)點(diǎn)間通信:爬蟲節(jié)點(diǎn)之間需要進(jìn)行協(xié)作和通信,比如共享URL隊(duì)列、傳遞爬取結(jié)果等。可以使用分布式消息系統(tǒng)(如RabbitMQ、Kafka)或者分布式存儲系統(tǒng)來實(shí)現(xiàn)節(jié)點(diǎn)間的通信和數(shù)據(jù)共享。 容錯和重試機(jī)制:由于分布式爬蟲環(huán)境中存在多個節(jié)點(diǎn),節(jié)點(diǎn)之間可能存在網(wǎng)絡(luò)故障、節(jié)點(diǎn)宕機(jī)等問題,需要考慮容錯和重試機(jī)制,保證系統(tǒng)的穩(wěn)定性和可靠性??梢允褂眯奶鴻C(jī)制、故障恢復(fù)策略等來處理節(jié)點(diǎn)故障和網(wǎng)絡(luò)異常。 爬蟲任務(wù)監(jiān)控和日志:為了實(shí)時監(jiān)控爬蟲節(jié)點(diǎn)的狀態(tài)和任務(wù)執(zhí)行情況,可以引入日志記錄和監(jiān)控系統(tǒng),對爬蟲任務(wù)進(jìn)行監(jiān)控和統(tǒng)計(jì)分析,及時發(fā)現(xiàn)和解決問題。
分布式爬蟲的實(shí)現(xiàn)
使用三臺機(jī)器,一臺是windows,兩臺是centos,分別在兩臺機(jī)器上部署scrapy來進(jìn)行分布式抓取一個網(wǎng)站 windows的ip地址為192.168.xxx.XXX,用來作為redis的master端,centos的機(jī)器作為slave master的爬蟲運(yùn)行時會把提取到的url封裝成request放到redis中的數(shù)據(jù)庫:“dmoz:requests”,并且從該數(shù)據(jù)庫中提取request后下載網(wǎng)頁,再把網(wǎng)頁的內(nèi)容存放到redis的另一個數(shù)據(jù)庫中“dmoz:items” slave從master的redis中取出待抓取的request,下載完網(wǎng)頁之后就把網(wǎng)頁的內(nèi)容發(fā)送回master的redis 重復(fù)上面的3和4,直到master的redis中的“dmoz:requests”數(shù)據(jù)庫為空,再把master的redis中的“dmoz:items”數(shù)據(jù)庫寫入到mongodb中 master里的reids還有一個數(shù)據(jù)“dmoz:dupefilter”是用來存儲抓取過的url的指紋(使用哈希函數(shù)將url運(yùn)算后的結(jié)果),是防止重復(fù)抓取的
scrapy-redis框架的安裝
一個三方的基于redis的分布式爬蟲框架,配合scrapy使用,讓爬蟲具有了分布式爬取的功能
github地址:?GitHub - rmax/scrapy-redis: Redis-based components for Scrapy.
安裝
pip install scrapy-redis==0.7.3
?
柚子快報(bào)激活碼778899分享:爬蟲的分布式思維與實(shí)現(xiàn)思路
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。