国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Node.js的分布式爬蟲(chóng)系統(tǒng)

2019-11-16 06:00高玉民翟浩然
電子技術(shù)與軟件工程 2019年20期
關(guān)鍵詞:任務(wù)調(diào)度爬蟲(chóng)隊(duì)列

文/高玉民 翟浩然

當(dāng)今世界,互聯(lián)網(wǎng)飛速發(fā)展,數(shù)據(jù)量呈指數(shù)級(jí)高速增長(zhǎng),企業(yè)和個(gè)人對(duì)于快速獲得有效信息的需求也越來(lái)越強(qiáng)烈。在數(shù)據(jù)采集方面,網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)的應(yīng)用,特別是基于Node.js技術(shù)的分布式爬蟲(chóng)系統(tǒng)的應(yīng)用,大大提升了數(shù)據(jù)采集的廣度和深度。

1 概述

本系統(tǒng)是基于Node.js技術(shù)、采用消息隊(duì)列通信的可配置的分布式爬蟲(chóng)系統(tǒng)。系統(tǒng)采用主從架構(gòu)、系統(tǒng)耦合度較低、可靈活配置多項(xiàng)任務(wù),也可根據(jù)需要快速部署新爬蟲(chóng),系統(tǒng)可擴(kuò)展性較強(qiáng)。

系統(tǒng)整體架構(gòu)采用Master-worker方式,即由Master節(jié)點(diǎn)監(jiān)控系統(tǒng)運(yùn)行,接收用戶(hù)控制,存儲(chǔ)最終數(shù)據(jù);Worker節(jié)點(diǎn)接受任務(wù)運(yùn)行,完成網(wǎng)頁(yè)下載和信息抽取工作。

如圖1所示,每一個(gè)爬蟲(chóng)系統(tǒng)有且只有1個(gè)Master節(jié)點(diǎn),該系統(tǒng)下Worker節(jié)點(diǎn)的數(shù)量受到消息隊(duì)列效率、數(shù)據(jù)抓取和存儲(chǔ)效率的限制,理論上可以有無(wú)限多個(gè)。Master和Worker節(jié)點(diǎn)采用消息隊(duì)列的方式進(jìn)行通信,Worker節(jié)點(diǎn)之間互不通信。

同時(shí),每一個(gè)爬蟲(chóng)系統(tǒng)需要配置一個(gè)Redis實(shí)例;不同爬蟲(chóng)系統(tǒng)之間可以共享一個(gè)Mongodb數(shù)據(jù)庫(kù),且最好使用一個(gè)Mongodb實(shí)例,以提高系統(tǒng)的運(yùn)行效率。

2 Master節(jié)點(diǎn)描述

每一個(gè)爬蟲(chóng)系統(tǒng)由一個(gè)Master節(jié)點(diǎn)統(tǒng)一進(jìn)行管理和控制,Master節(jié)點(diǎn)主要功能包括監(jiān)控各節(jié)點(diǎn)工作狀態(tài),接收、分配和管理爬蟲(chóng)任務(wù),數(shù)據(jù)存儲(chǔ)等。

2.1 系統(tǒng)啟動(dòng)和通信

系統(tǒng)啟動(dòng)時(shí),Master節(jié)點(diǎn)會(huì)依次啟動(dòng)自身的Http服務(wù)、數(shù)據(jù)庫(kù)連接和消息隊(duì)列連接。完成消息隊(duì)列連接后,系統(tǒng)會(huì)收到項(xiàng)下所有Worker節(jié)點(diǎn)的上線(xiàn)信息,并將這些節(jié)點(diǎn)的相關(guān)信息存儲(chǔ)在自身Worker列表中,以方便任務(wù)調(diào)用。

Master和Worker之間使用消息隊(duì)列進(jìn)行通信,通信消息格式如表1所示。

本系統(tǒng)的消息隊(duì)列通過(guò)Redis推送/訂閱模塊實(shí)現(xiàn),若選用其他消息隊(duì)列系統(tǒng),可重新編寫(xiě)通信格式。

2.2 節(jié)點(diǎn)監(jiān)控

每當(dāng)有新的Worker節(jié)點(diǎn)上線(xiàn),Master節(jié)點(diǎn)都會(huì)收到并記錄該Worker節(jié)點(diǎn)的信息,并通過(guò)分配任務(wù)和任務(wù)回調(diào),判斷節(jié)點(diǎn)當(dāng)前是否空閑。若節(jié)點(diǎn)掉線(xiàn),Master會(huì)將該Worker移除Worker列表。用戶(hù)可通過(guò)Master提供的網(wǎng)絡(luò)API查詢(xún)當(dāng)前所有節(jié)點(diǎn)的信息和運(yùn)行狀態(tài),但不可指定Worker節(jié)點(diǎn)任務(wù)分配,不可指定Worker結(jié)束運(yùn)行。

若Master節(jié)點(diǎn)掉線(xiàn),其所屬所有Worker節(jié)點(diǎn)都將記錄當(dāng)前工作狀態(tài),正在執(zhí)行任務(wù)的節(jié)點(diǎn)會(huì)停止當(dāng)前工作,等待Master重新上線(xiàn)。

2.3 任務(wù)的接收、分配和管理

Master節(jié)點(diǎn)提供一系列的網(wǎng)絡(luò)API方便用戶(hù)提交任務(wù)并監(jiān)控任務(wù)狀態(tài)。

2.3.1 任務(wù)提交

在系統(tǒng)上線(xiàn)后,用戶(hù)可通過(guò)Master節(jié)點(diǎn)提供的網(wǎng)絡(luò)API上傳爬取任務(wù)。每個(gè)任務(wù)都需要填寫(xiě)統(tǒng)一的任務(wù)信息,以便爬蟲(chóng)能夠識(shí)別任務(wù)、過(guò)濾URL和網(wǎng)頁(yè)元素、合成最終數(shù)據(jù)。

任務(wù)數(shù)據(jù)包含的內(nèi)容具體如表2所示。

用戶(hù)填寫(xiě)好上述信息后,封裝成Json格式,向/New_task發(fā)起Post請(qǐng)求;若任務(wù)被成功接收,系統(tǒng)會(huì)返回成功信息和任務(wù)當(dāng)前狀態(tài)。

2.3.2 任務(wù)運(yùn)行和狀態(tài)

Master獲得任務(wù)后,會(huì)通過(guò)下屬Worker節(jié)點(diǎn)的信息來(lái)分配任務(wù)。一般來(lái)說(shuō),Master總是選擇第一個(gè)空閑Worker來(lái)分配任務(wù);若沒(méi)有空閑Worker節(jié)點(diǎn),則接收到的任務(wù)進(jìn)入任務(wù)等待隊(duì)列。

分配好的任務(wù)會(huì)將自身狀態(tài)設(shè)置為“運(yùn)行中”,并記錄負(fù)責(zé)該任務(wù)的Worker節(jié)點(diǎn)信息。用戶(hù)可通過(guò)查詢(xún)?nèi)蝿?wù)來(lái)獲取Worker信息,然后通過(guò)查看Worker當(dāng)前狀態(tài)來(lái)獲取該任務(wù)的進(jìn)度。

用戶(hù)可以隨時(shí)取消等待隊(duì)列中的任務(wù),取消后,該任務(wù)狀態(tài)設(shè)置為“已取消”,不再被任何Worker運(yùn)行。用戶(hù)也可以取消正在運(yùn)行中的任務(wù),即,通過(guò)取消負(fù)責(zé)該任務(wù)的Worker當(dāng)前工作來(lái)完成這一動(dòng)作;取消正在進(jìn)行的任務(wù)時(shí),Worker會(huì)等待該任務(wù)當(dāng)前最后一個(gè)URL抓取成功后再取消任務(wù)的運(yùn)行,避免異常情況的發(fā)生;任務(wù)取消后,Worker會(huì)通知Master任務(wù)已經(jīng)取消,Master會(huì)將該Worker節(jié)點(diǎn)置為空閑狀態(tài)。

Worker在完成任務(wù)后,會(huì)向Master節(jié)點(diǎn)返回任務(wù)完成信息;Master節(jié)點(diǎn)將該Worker狀態(tài)置為空閑。

在任務(wù)完成或進(jìn)行中任務(wù)被取消后,Master節(jié)點(diǎn)向任務(wù)等待隊(duì)列詢(xún)問(wèn)是否有等待任務(wù);若發(fā)現(xiàn)等待任務(wù),則進(jìn)入新的任務(wù)分配和運(yùn)行環(huán)節(jié)。如圖2所示。

2.3.3 定時(shí)任務(wù)

對(duì)于需要定時(shí)爬取的任務(wù),不必通過(guò)網(wǎng)絡(luò)API指定,僅需要將其配置在Master啟動(dòng)任務(wù)文件中,由Master節(jié)點(diǎn)按時(shí)調(diào)用。具體任務(wù)的創(chuàng)建、分配及管理過(guò)程如上文所示。

表1

圖1:系統(tǒng)整體架構(gòu)圖

圖2

圖3

2.4 數(shù)據(jù)存儲(chǔ)

每當(dāng)Worker節(jié)點(diǎn)抓取到一條符合要求的數(shù)據(jù)后,都會(huì)將抓取后的數(shù)據(jù)按照一定的格式返回Master,由Master節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)存儲(chǔ)。由于系統(tǒng)運(yùn)行速度和數(shù)據(jù)格式的不斷變化,本系統(tǒng)數(shù)據(jù)存儲(chǔ)采用Mongodb數(shù)據(jù)庫(kù)。數(shù)據(jù)存儲(chǔ)格式如表3所示。

用戶(hù)可根據(jù)爬取任務(wù)域和主題從本數(shù)據(jù)庫(kù)中提取數(shù)據(jù),以便進(jìn)行深層次的分析和應(yīng)用。

3 Worker節(jié)點(diǎn)描述

Worker節(jié)點(diǎn)負(fù)責(zé)從Master接受任務(wù)、爬取信息,并將用戶(hù)所需的結(jié)果返回至Master。Worker節(jié)點(diǎn)由任務(wù)調(diào)度器、網(wǎng)頁(yè)下載器、內(nèi)容抽取器組成。

3.1 啟動(dòng)和通信

Worker啟動(dòng)時(shí),會(huì)自動(dòng)啟動(dòng)一個(gè)Redis客戶(hù)端,用于和Master進(jìn)行消息通信。同時(shí),檢查自身是否存在未完成任務(wù),避免異常退出重啟導(dǎo)致任務(wù)丟失。完成前述動(dòng)作后,Worker會(huì)根據(jù)配置好的信息源爬取代理IP信息,并存入任務(wù)調(diào)度模塊中。

啟動(dòng)完成后,Worker會(huì)向Master發(fā)送注冊(cè)請(qǐng)求,將自身信息注冊(cè)到Master上,具體通信格式請(qǐng)參照上文相關(guān)內(nèi)容。若Worker發(fā)現(xiàn)存在未完成的任務(wù),則直接進(jìn)行任務(wù)中余下的網(wǎng)頁(yè)爬取,并在注冊(cè)時(shí)提交自身“非空閑”的信息。

若Master節(jié)點(diǎn)掉線(xiàn),在工作中的Worker節(jié)點(diǎn)收到通知后會(huì)立即暫停當(dāng)前任務(wù),等待Master節(jié)點(diǎn)上線(xiàn)后重新啟動(dòng)任務(wù)。

3.2 任務(wù)調(diào)度器

任務(wù)調(diào)度器負(fù)責(zé)跟蹤任務(wù)URL列表,根據(jù)爬取記錄添加新的URL、刪除已經(jīng)抓取過(guò)的URL。任務(wù)調(diào)度器會(huì)直接丟棄新爬取的網(wǎng)頁(yè)鏈接中已經(jīng)抓取過(guò)的URL。在分配網(wǎng)頁(yè)抓取任務(wù)時(shí),從代理IP列表中隨機(jī)抽取一個(gè),供網(wǎng)頁(yè)下載器使用。

網(wǎng)頁(yè)抓取完成后,任務(wù)調(diào)度器負(fù)責(zé)處理抓取信息,從中提取URL所在網(wǎng)站的其他未抓取的URL,完成計(jì)數(shù)、統(tǒng)計(jì)代理IP是否失效、將處理好的結(jié)果發(fā)送給Master節(jié)點(diǎn)的相關(guān)工作??傮w來(lái)說(shuō),任務(wù)調(diào)度器可以看作是任務(wù)和爬取結(jié)果的一個(gè)中間層設(shè)置。

3.3 網(wǎng)頁(yè)下載器

為靈活應(yīng)對(duì)不同情形,本系統(tǒng)采用三種方式進(jìn)行網(wǎng)頁(yè)下載,具體如下:

(1)當(dāng)網(wǎng)頁(yè)中不存在反爬取功能時(shí),系統(tǒng)使用Request模塊進(jìn)行網(wǎng)頁(yè)請(qǐng)求和內(nèi)容獲??;

(2)當(dāng)網(wǎng)頁(yè)中存在反爬取功能,需要渲染出整個(gè)網(wǎng)頁(yè)或在其中需要模擬鼠標(biāo)鍵盤(pán)事件的,系統(tǒng)會(huì)通過(guò)進(jìn)程間通信,使用Phantomjs軟件進(jìn)行渲染和網(wǎng)頁(yè)內(nèi)容獲??;

(3)當(dāng)信息源提供公開(kāi)的網(wǎng)絡(luò)API時(shí),可通過(guò)網(wǎng)絡(luò)API繞過(guò)內(nèi)容抽取器直接獲取對(duì)應(yīng)信息。

以上三種方法均支持通過(guò)代理IP向目標(biāo)服務(wù)通信。其中,在使用Phantomjs時(shí),支持調(diào)用Phantomjs腳本,以便更好地模擬真人試用網(wǎng)頁(yè)的情況。

表2

表3

3.4 內(nèi)容抽取器

內(nèi)容抽取器是Worker節(jié)點(diǎn)的最核心模塊,負(fù)責(zé)將下載好的網(wǎng)頁(yè)信息按照用戶(hù)配置的方法從DOM元素中提取相應(yīng)的字段、搜集URL目標(biāo)網(wǎng)站包含的其他鏈接,并按照用戶(hù)規(guī)定的模式,從相應(yīng)DOM中獲取數(shù)據(jù),按照標(biāo)題組合形成Object實(shí)體;最后將抽取組合好的信息返回給任務(wù)調(diào)度器,由任務(wù)調(diào)度器作出最終處理,返回給Master。

3.5 Worker組件圖

如圖3所示。

4 結(jié)語(yǔ)

需求,隨時(shí)增加或減少Worker節(jié)點(diǎn),提升系統(tǒng)的運(yùn)營(yíng)效率。

(2)本系統(tǒng)支持用戶(hù)根據(jù)網(wǎng)頁(yè)特性和數(shù)據(jù)分布,自定義信息提取的DOM標(biāo)記,并分配給每個(gè)信息項(xiàng)目一個(gè)標(biāo)題,自動(dòng)完成面向數(shù)據(jù)的規(guī)范化過(guò)程,大幅度減少數(shù)據(jù)應(yīng)用和分析的ETL時(shí)間,從源頭上加快信息收集的效率。即,一切任務(wù)以用戶(hù)所想的方式進(jìn)行,一切數(shù)據(jù)以用戶(hù)所需的形式處理。

(3)本系統(tǒng)采用Mongodb作為數(shù)據(jù)存儲(chǔ)的工具,其Schema-free的特征保證了在完全兼容多變的數(shù)據(jù)結(jié)構(gòu)的情況下,最大程度地保持?jǐn)?shù)據(jù)的規(guī)范性,并能夠在快速運(yùn)行時(shí)兼顧多Worker同時(shí)工作場(chǎng)景下的數(shù)據(jù)存儲(chǔ)要求。

(4)本系統(tǒng)通過(guò)代理訪(fǎng)問(wèn)目標(biāo)源,防止目標(biāo)源根據(jù)請(qǐng)求發(fā)起IP限制訪(fǎng)問(wèn);本系統(tǒng)規(guī)定了每個(gè)IP訪(fǎng)問(wèn)目標(biāo)源的最小時(shí)間間隔,不會(huì)對(duì)目標(biāo)服務(wù)進(jìn)行過(guò)度請(qǐng)求,保證了目標(biāo)源的運(yùn)營(yíng)安全;同時(shí),對(duì)于采取了輕度反爬措施的網(wǎng)站,本系統(tǒng)也有相應(yīng)的處理方法,增強(qiáng)了系統(tǒng)的可用性。

(1)本系統(tǒng)基于Node.js技術(shù)開(kāi)發(fā),與其他技術(shù)框架相比,能夠更好地處理由Javascript渲染的網(wǎng)頁(yè)信息、支持Json這種應(yīng)用最廣泛的網(wǎng)絡(luò)數(shù)據(jù)格式。

同時(shí),由于Javascript本身的特性,本系統(tǒng)在保持與Python開(kāi)發(fā)效率相當(dāng)?shù)那闆r下,實(shí)現(xiàn)更快速度的運(yùn)行。此外,Node.js框架與Java技術(shù)在網(wǎng)頁(yè)內(nèi)容抓取的效率相當(dāng),但該框架在IO方面的性能更加高效,占用的機(jī)器資源更少,有利于降低開(kāi)發(fā)和使用成本。

本系統(tǒng)使用PM2模塊進(jìn)行部署和管理,同時(shí),由于采用了分布式架構(gòu),可以根據(jù)業(yè)務(wù)

猜你喜歡
任務(wù)調(diào)度爬蟲(chóng)隊(duì)列
利用網(wǎng)絡(luò)爬蟲(chóng)技術(shù)驗(yàn)證房地產(chǎn)灰犀牛之說(shuō)
基于Python的網(wǎng)絡(luò)爬蟲(chóng)和反爬蟲(chóng)技術(shù)研究
隊(duì)列里的小秘密
基于改進(jìn)NSGA-Ⅱ算法的協(xié)同制造任務(wù)調(diào)度研究
在隊(duì)列里
基于時(shí)間負(fù)載均衡蟻群算法的云任務(wù)調(diào)度優(yōu)化
利用爬蟲(chóng)技術(shù)的Geo-Gnutel la VANET流量采集
豐田加速駛?cè)胱詣?dòng)駕駛隊(duì)列
大數(shù)據(jù)環(huán)境下基于python的網(wǎng)絡(luò)爬蟲(chóng)技術(shù)
云計(jì)算環(huán)境中任務(wù)調(diào)度策略