本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種任務(wù)分配方法及裝置。
背景技術(shù):
網(wǎng)絡(luò)爬蟲是一種按照一定的規(guī)則,自動(dòng)地抓取萬維網(wǎng)信息的程序或者腳本。
隨著網(wǎng)絡(luò)的迅速發(fā)展,萬維網(wǎng)成為大量信息的載體,如何有效地提取并利用這些信息成為一個(gè)巨大的挑戰(zhàn),網(wǎng)絡(luò)爬蟲是一種有效的將萬維網(wǎng)中分散的網(wǎng)頁信息抓取聚集并予以利用的方法。
抓取效率是爬蟲的關(guān)鍵點(diǎn),如何提高抓取效率是當(dāng)前需要解決的技術(shù)問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供一種任務(wù)分配方法及裝置,能夠提高抓取效率。
本發(fā)明實(shí)施例采用如下技術(shù)方案:
一種任務(wù)分配方法,包括:
建立多個(gè)優(yōu)先級(jí)隊(duì)列;
獲取任務(wù),任務(wù)包含一個(gè)需要爬蟲抓取的統(tǒng)一資源定位符URL,確定任務(wù)的優(yōu)先級(jí)及優(yōu)先級(jí)隊(duì)列標(biāo)識(shí);
按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列;
從優(yōu)先級(jí)隊(duì)列中取出任務(wù),存入消息隊(duì)列;
下載模塊獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載。
可選的,任務(wù)的優(yōu)先級(jí)為多級(jí),建立多個(gè)優(yōu)先級(jí)隊(duì)列包括:
確定每個(gè)優(yōu)先級(jí)隊(duì)列標(biāo)識(shí),確定每個(gè)優(yōu)先級(jí)隊(duì)列的權(quán)重占比,每個(gè)優(yōu)先級(jí)隊(duì)列包含多個(gè)任務(wù)元組,多個(gè)任務(wù)元組分別對(duì)應(yīng)任務(wù)優(yōu)先級(jí);
優(yōu)先級(jí)隊(duì)列任務(wù)元組按照任務(wù)優(yōu)先級(jí)依次設(shè)置權(quán)重占比。
可選的,按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列包括:
按照任務(wù)的優(yōu)先級(jí)在對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列中查找到對(duì)應(yīng)的任務(wù)元組。
可選的,從優(yōu)先級(jí)隊(duì)列中取出任務(wù)包括:
在每個(gè)優(yōu)先級(jí)隊(duì)列內(nèi)部任務(wù)元組中按照優(yōu)先級(jí)從高到低的順序取出預(yù)定個(gè)數(shù)的任務(wù);其中,每個(gè)元組取出預(yù)定任務(wù)個(gè)數(shù)的計(jì)算方法為,該隊(duì)列取出任務(wù)總數(shù)乘以該任務(wù)元組的優(yōu)先級(jí)隊(duì)列權(quán)重占比。
可選的,下載模塊獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載包括:
下載模塊為分布式部署方式,根據(jù)分發(fā)集群的負(fù)載情況,通過Host哈希等負(fù)載均衡LB算法,將該隊(duì)列信息推送給集群中的一個(gè)Fetcher節(jié)點(diǎn)處理,并通過回調(diào)方式獲取隊(duì)列信息的執(zhí)行情況。
可選的,任務(wù)的優(yōu)先級(jí)分為優(yōu)先級(jí)依次升高的為級(jí)0到4級(jí),每個(gè)優(yōu)先級(jí)隊(duì)列包含5任務(wù)元組;
一任務(wù)元組對(duì)應(yīng)一級(jí)任務(wù)優(yōu)先級(jí),任務(wù)元組為先進(jìn)先出隊(duì)列,任務(wù)元組每個(gè)元素為一個(gè)獨(dú)立的任務(wù),優(yōu)先級(jí)隊(duì)列任務(wù)元組權(quán)重占比為,0級(jí)至4級(jí)依次對(duì)應(yīng)35%、30%、20%、10%、5%。
一種任務(wù)分配裝置,包括:
獲取模塊,用于獲取任務(wù),任務(wù)包含一個(gè)需要爬蟲抓取的統(tǒng)一資源定位符URL,確定任務(wù)的優(yōu)先級(jí)及優(yōu)先級(jí)隊(duì)列標(biāo)識(shí);
隊(duì)列模塊,用于建立多個(gè)優(yōu)先級(jí)隊(duì)列;
處理模塊,用于按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列,從優(yōu)先級(jí)隊(duì)列中取出任務(wù),存入消息隊(duì)列;
下載模塊,用于獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載。
可選的,獲取模塊具體用于,建立任務(wù),生成隊(duì)列信息,隊(duì)列信息包含任 務(wù)的全局唯一id、抓取URL、fetcher_class,并將隊(duì)列信息存入消息隊(duì)列中。
可選的,處理模塊包括:任務(wù)調(diào)取單元、任務(wù)分發(fā)單元、收取單元;
隊(duì)列模塊設(shè)置隊(duì)列優(yōu)先級(jí)別,高優(yōu)先級(jí)的隊(duì)列信息優(yōu)先被任務(wù)調(diào)取單元調(diào)度;
任務(wù)調(diào)取單元讀取自身配置,根據(jù)任務(wù)調(diào)度策略每隔一段時(shí)間從消息隊(duì)列讀取一定數(shù)量的隊(duì)列信息放入消息隊(duì)列;
任務(wù)分發(fā)單元向消息隊(duì)列讀取任務(wù),獲得下一個(gè)執(zhí)行的隊(duì)列信息,然后根據(jù)分發(fā)集群的負(fù)載情況,通過Host哈希等負(fù)載均衡LB算法,將該隊(duì)列信息推送給集群中的一個(gè)Fetcher節(jié)點(diǎn)處理,并通過回調(diào)方式獲取隊(duì)列信息的執(zhí)行情況;
收取單元部署在一個(gè)集群之上,集群中的節(jié)點(diǎn)接收收取單元推送的隊(duì)列信息,分析隊(duì)列信息中fetcher_class,調(diào)用對(duì)應(yīng)類型的收取單元去抓取URL數(shù)據(jù),之后通過分析隊(duì)列信息中handler_class信息將抓取返回的數(shù)據(jù)交付指定的下載模塊進(jìn)行后續(xù)處理。
可選的,存儲(chǔ)模塊接收收取單元的抓取數(shù)據(jù),根據(jù)隊(duì)列信息的配置信息,對(duì)數(shù)據(jù)采用不同的方法進(jìn)行后續(xù)處理,將需要存儲(chǔ)的數(shù)據(jù)放入Hive/Hbase集群中,并且將新發(fā)現(xiàn)的URL建立新的與父任務(wù)的id一致的隊(duì)列信息,并將新的隊(duì)列信息提交到獲取模塊中,從而進(jìn)行新的一輪處理。
基于上述技術(shù)方案的任務(wù)分配方法及裝置,建立多個(gè)優(yōu)先級(jí)隊(duì)列,獲取任務(wù),確定任務(wù)的優(yōu)先級(jí)及優(yōu)先級(jí)隊(duì)列標(biāo)識(shí),按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列,從優(yōu)先級(jí)隊(duì)列中取出任務(wù),存入消息隊(duì)列,下載模塊獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載,從而實(shí)現(xiàn)根據(jù)任務(wù)優(yōu)先級(jí)抓取信息,從而提高抓取效率。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本公開。
附圖說明
此處的附圖被并入說明書中并構(gòu)成本說明書的一部分,示出了符合本發(fā)明的實(shí)施例,并與說明書一起用于解釋本發(fā)明的原理。
圖1為本發(fā)明實(shí)施例提供的任務(wù)分配方法的流程圖。
圖2為本發(fā)明實(shí)施例提供的分布式網(wǎng)絡(luò)爬蟲任務(wù)分配流程圖。
圖3為本發(fā)明實(shí)施例提供的任務(wù)加入優(yōu)先級(jí)隊(duì)列整體流程圖。
圖4為本發(fā)明實(shí)施例提供的優(yōu)先級(jí)隊(duì)列取出任務(wù)流程圖示意圖。
圖5為本發(fā)明實(shí)施例提供的優(yōu)先級(jí)隊(duì)列內(nèi)部元組級(jí)別任務(wù)取出流程示意圖。
圖6為本發(fā)明實(shí)施例提供的任務(wù)分配裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本發(fā)明相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本發(fā)明的一些方面相一致的裝置和方法的例子。
本發(fā)明實(shí)施例涉及一種任務(wù)分配方法及裝置,可以應(yīng)用于分布式網(wǎng)絡(luò)進(jìn)行爬蟲任務(wù)分配,可以通過任務(wù)分配策略實(shí)現(xiàn)爬蟲模塊分布式并行抓取,能夠保證爬蟲模塊負(fù)載均衡,能夠?qū)为?dú)的抓取任務(wù)設(shè)置優(yōu)先級(jí),能夠通過設(shè)置多個(gè)優(yōu)先級(jí)隊(duì)列保證低優(yōu)先級(jí)的任務(wù)也能有執(zhí)行的機(jī)會(huì)。本發(fā)明實(shí)施例能夠滿足支持大量的網(wǎng)頁抓取任務(wù)并行執(zhí)行,并且能夠通過設(shè)置優(yōu)先級(jí)的方式使重點(diǎn)抓取任務(wù)優(yōu)先執(zhí)行,整體抓取過程運(yùn)行順暢。
本發(fā)明實(shí)施例可以解決在爬蟲在并行處理和任務(wù)分配中的不合理問題。
實(shí)施例1
如圖1所示,本發(fā)明實(shí)施例提供一種任務(wù)分配方法,該發(fā)明合法可以應(yīng)用于分布式網(wǎng)絡(luò)或者其他計(jì)算機(jī)網(wǎng)絡(luò),該方法包括:
11、建立多個(gè)優(yōu)先級(jí)隊(duì)列;
12、獲取任務(wù),任務(wù)包含一個(gè)需要爬蟲抓取的統(tǒng)一資源定位符URL,確定任務(wù)的優(yōu)先級(jí)及優(yōu)先級(jí)隊(duì)列標(biāo)識(shí);
13、按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列;
14、從優(yōu)先級(jí)隊(duì)列中取出任務(wù),存入消息隊(duì)列;
15、下載模塊獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載。
本發(fā)明實(shí)施例的任務(wù)分配方法,建立多個(gè)優(yōu)先級(jí)隊(duì)列,獲取任務(wù),確定任務(wù)的優(yōu)先級(jí)及優(yōu)先級(jí)隊(duì)列標(biāo)識(shí),按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列,從優(yōu)先級(jí)隊(duì)列中取出任務(wù),存入消息隊(duì)列,下載模塊獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載,從而實(shí)現(xiàn)根據(jù)任務(wù)優(yōu)先級(jí)抓取信息,從而提高抓取效率。
在一個(gè)實(shí)施例中,上述步驟12中任務(wù)包括:任務(wù)需要抓取的URL(Uniform Resource Locator)、任務(wù)的優(yōu)先級(jí)、任務(wù)優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)。例如,優(yōu)先級(jí)設(shè)置分為5級(jí),0級(jí)為優(yōu)先級(jí)最低4為優(yōu)先級(jí)最高,優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)用于標(biāo)識(shí)任務(wù)即將放入的優(yōu)先級(jí)隊(duì)列。
在一個(gè)實(shí)施例中,上述任務(wù)的優(yōu)先級(jí)為多級(jí),上述步驟11中建立多個(gè)優(yōu)先級(jí)隊(duì)列包括:
確定每個(gè)優(yōu)先級(jí)隊(duì)列標(biāo)識(shí),確定每個(gè)優(yōu)先級(jí)隊(duì)列的權(quán)重占比,每個(gè)優(yōu)先級(jí)隊(duì)列包含多個(gè)任務(wù)元組,多個(gè)任務(wù)元組分別對(duì)應(yīng)任務(wù)優(yōu)先級(jí);優(yōu)先級(jí)隊(duì)列任務(wù)元組按照任務(wù)優(yōu)先級(jí)依次設(shè)置權(quán)重占比。
具體的,任務(wù)的優(yōu)先級(jí)分為優(yōu)先級(jí)依次升高的為級(jí)0到4級(jí),每個(gè)優(yōu)先級(jí)隊(duì)列包含5任務(wù)元組;
一任務(wù)元組對(duì)應(yīng)一級(jí)任務(wù)優(yōu)先級(jí),任務(wù)元組為先進(jìn)先出隊(duì)列,任務(wù)元組每個(gè)元素為一個(gè)獨(dú)立的任務(wù),優(yōu)先級(jí)隊(duì)列任務(wù)元組權(quán)重占比為,0級(jí)至4級(jí)依次對(duì)應(yīng)35%、30%、20%、10%、5%。
具體的,優(yōu)先級(jí)隊(duì)列需設(shè)置為多個(gè),分別設(shè)置優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)。每個(gè)優(yōu)先級(jí)隊(duì)列,包含5任務(wù)元組,分別對(duì)應(yīng)的任務(wù)優(yōu)先級(jí)。
在一個(gè)實(shí)施例中,上述步驟13按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列包括:
按照任務(wù)的優(yōu)先級(jí)在對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列中查找到對(duì)應(yīng)的任務(wù)元組。
具體的,任務(wù)放入優(yōu)先級(jí)隊(duì)列方式:按照任務(wù)的優(yōu)先級(jí)隊(duì)列名稱找到對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列,按照任務(wù)的優(yōu)先級(jí)在該優(yōu)先級(jí)隊(duì)列中找到對(duì)應(yīng)的任務(wù)元組,將任務(wù)放入該任務(wù)元組的隊(duì)列末尾。
可選的,上述步驟14從優(yōu)先級(jí)隊(duì)列中取出任務(wù)包括:
在每個(gè)優(yōu)先級(jí)隊(duì)列內(nèi)部任務(wù)元組中按照優(yōu)先級(jí)從高到低的順序取出預(yù)定個(gè)數(shù)的任務(wù);其中,每個(gè)元組取出預(yù)定任務(wù)個(gè)數(shù)的計(jì)算方法為,該隊(duì)列取出任務(wù)總數(shù)乘以該任務(wù)元組的優(yōu)先級(jí)隊(duì)列權(quán)重占比。
具體的,每個(gè)優(yōu)先級(jí)隊(duì)列需要取出均等的任務(wù)條數(shù),每個(gè)優(yōu)先級(jí)隊(duì)列內(nèi)部取出具體方法是在每個(gè)優(yōu)先級(jí)隊(duì)列內(nèi)部任務(wù)元組中按照優(yōu)先級(jí)從高到低的順序取出預(yù)定個(gè)數(shù)的任務(wù),每個(gè)元組取出預(yù)定任務(wù)個(gè)數(shù)的計(jì)算方法為:該隊(duì)列取出任務(wù)總數(shù)乘以該任務(wù)元組的優(yōu)先級(jí)隊(duì)列權(quán)重占比。如果某一任務(wù)元組任務(wù)數(shù)量不足預(yù)定個(gè)數(shù),則將該元組的任務(wù)全部取出,并將元組任務(wù)數(shù)量與預(yù)定個(gè)數(shù)的差額在該優(yōu)先級(jí)對(duì)列的其他元組中取出,取出順序?yàn)閮?yōu)先級(jí)從高到低。當(dāng)該優(yōu)先級(jí)隊(duì)列取出任務(wù)數(shù)量達(dá)到要求或者該優(yōu)先級(jí)隊(duì)列所有元組任務(wù)均被取完時(shí),將取出的任務(wù)順序存入消息隊(duì)列。經(jīng)過步驟14后消息隊(duì)列中的任務(wù)序列滿足優(yōu)先級(jí)要求,高優(yōu)先的任務(wù)排列在消息隊(duì)列的前面,低優(yōu)先級(jí)隊(duì)列的任務(wù)排列在消息隊(duì)列的后面。消息隊(duì)列為先進(jìn)先出隊(duì)列。
可選的,上述步驟15下載模塊獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載包括:
下載模塊為分布式部署方式,采用拉式的方式每個(gè)模塊從消息隊(duì)列中順序獲取任務(wù),根據(jù)任務(wù)包含的URL下載網(wǎng)頁。
具體的,根據(jù)分發(fā)集群的負(fù)載情況,通過Host哈希等負(fù)載均衡LB算法,將該隊(duì)列信息推送給集群中的一個(gè)Fetcher節(jié)點(diǎn)處理,并通過回調(diào)方式獲取隊(duì) 列信息的執(zhí)行情況。
本發(fā)明實(shí)施例的任務(wù)分配方法,建立多個(gè)優(yōu)先級(jí)隊(duì)列,獲取任務(wù),確定任務(wù)的優(yōu)先級(jí)及優(yōu)先級(jí)隊(duì)列標(biāo)識(shí),按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列,從優(yōu)先級(jí)隊(duì)列中取出任務(wù),存入消息隊(duì)列,下載模塊獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載,從而實(shí)現(xiàn)根據(jù)任務(wù)優(yōu)先級(jí)抓取信息,從而提高抓取效率。
實(shí)施例2
本發(fā)明實(shí)施例提供一種任務(wù)分配方法,完成分布式網(wǎng)絡(luò)爬蟲任務(wù)分配需要經(jīng)過圖2逐個(gè)過程,本實(shí)施例中,以消息隊(duì)列數(shù)目設(shè)置為5起立進(jìn)行說明。
如圖2所示,本實(shí)施例的任務(wù)分配方法包括:
21、建立任務(wù)列表需要完成兩部分的工作。
具體的,第一部分,任務(wù)分配優(yōu)先級(jí)隊(duì)列;第二部分任務(wù)設(shè)置優(yōu)先級(jí);第三部分存儲(chǔ)任務(wù)。
具體的,任務(wù)的URL可以通過預(yù)先定義、爬蟲系統(tǒng)自動(dòng)發(fā)現(xiàn)和周期性執(zhí)行爬取任務(wù)得來。將任務(wù)隨機(jī)分配優(yōu)先級(jí)隊(duì)列,也可以根據(jù)任務(wù)在業(yè)務(wù)上的上下游關(guān)系指定優(yōu)先級(jí)隊(duì)列。根據(jù)任務(wù)的重要度設(shè)置優(yōu)先級(jí),優(yōu)先級(jí)為5級(jí),0級(jí)為優(yōu)先級(jí)最低4為優(yōu)先級(jí)最高。此處設(shè)置優(yōu)先級(jí)隊(duì)列名稱和優(yōu)先級(jí)的原則是,前后任務(wù)之間執(zhí)行順序要求緊密的任務(wù)放入同一優(yōu)先級(jí)隊(duì)列,重要任務(wù)設(shè)置高優(yōu)先級(jí);前后任務(wù)之間執(zhí)行順序要求不緊密的任務(wù)放入不同的優(yōu)先級(jí)隊(duì)列,以保證各任務(wù)的對(duì)立性。任務(wù)列表可以存放在關(guān)系型數(shù)據(jù)庫中,任務(wù)的URL、優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)、優(yōu)先級(jí)是必須存儲(chǔ)的字段。
22、任務(wù)加入優(yōu)先級(jí)隊(duì)列并取出。
具體的,將步驟21存儲(chǔ)的任務(wù)取出加入到優(yōu)先級(jí)隊(duì)列中,任務(wù)加入優(yōu)先級(jí)隊(duì)列的具體過程如圖3所示,描述優(yōu)先級(jí)隊(duì)列名稱為E,優(yōu)先級(jí)為2的任務(wù)加入優(yōu)先級(jí)隊(duì),首先需要根據(jù)優(yōu)先級(jí)隊(duì)列名稱找到優(yōu)先級(jí)隊(duì)列E,進(jìn)入優(yōu)先級(jí)隊(duì)列E找到任務(wù)元組2,將任務(wù)插入到任務(wù)元組2末尾位置。
23、任務(wù)取出消息隊(duì)列具體流程。
如圖4所示,,取出POP_NUM個(gè)任務(wù)需要每個(gè)消息隊(duì)列平均取出POP_NUM除以消息隊(duì)列個(gè)數(shù)個(gè)任務(wù),如果仍有余數(shù)(DIFF),可用應(yīng)用開發(fā)語言提供的隨機(jī)函數(shù),隨機(jī)找出一個(gè)優(yōu)先級(jí)隊(duì)列取出余數(shù)(DIFF)個(gè)任務(wù)。
優(yōu)先級(jí)隊(duì)列內(nèi)部任務(wù)元組間選取任務(wù)的方式,如圖5所示。開始步驟201,設(shè)置選取優(yōu)先級(jí)為最高優(yōu)先級(jí);步驟202,計(jì)算該優(yōu)先級(jí)元組需要取出任務(wù)的數(shù)目,計(jì)算方法為:該優(yōu)先級(jí)隊(duì)列取出總數(shù)*優(yōu)先級(jí)隊(duì)列任務(wù)元組權(quán)重占比得出,其中權(quán)重占比的值安裝權(quán)重,0級(jí)至4級(jí)分別對(duì)應(yīng),35%、30%、20%、10%、5%;步驟203,根據(jù)當(dāng)前選取優(yōu)先級(jí)找到對(duì)應(yīng)的該優(yōu)先級(jí)的任務(wù)元組;步驟204,判斷任務(wù)元組中任務(wù)數(shù)量是否充足,充足時(shí)執(zhí)行步驟205,不充足時(shí)執(zhí)行步驟208;步驟205,滿足步驟204時(shí)取出要求的任務(wù)數(shù)目;步驟206,判斷選取優(yōu)先級(jí)是否為最低優(yōu)先級(jí)0級(jí),是最低優(yōu)先級(jí)執(zhí)行步驟210,不是最低優(yōu)先級(jí)執(zhí)行步驟207;步驟207,不滿足步驟206時(shí),將選擇優(yōu)先級(jí)降低一級(jí);步驟208不滿足任務(wù)204時(shí)取出當(dāng)前元組的全部任務(wù);步驟209,將不足的任務(wù)個(gè)數(shù)計(jì)入差額;步驟210,判斷差額是否為0,差額是0流程結(jié)束,差額不為0執(zhí)行步驟211;步驟211,不滿足步驟210時(shí)判斷當(dāng)前元組是否為空,元組為空?qǐng)?zhí)行流程結(jié)束,元組不為空?qǐng)?zhí)行步驟212;步驟212,不滿足步驟211時(shí)設(shè)置選取優(yōu)先級(jí)為最高優(yōu)先級(jí);步驟203,取出差額個(gè)任務(wù),并轉(zhuǎn)向步驟203。
24、下載模塊從隊(duì)列取出任務(wù)。
消息隊(duì)列可以選取通用的先進(jìn)先出隊(duì)列包括但不限于RabbitMQ。下載模塊為了保證充分利用網(wǎng)絡(luò)資源需要在多個(gè)服務(wù)器間分開部署,每一下載模塊獨(dú)立連接消息隊(duì)列,持續(xù)獲取消息隊(duì)列中的任務(wù)。
本發(fā)明實(shí)施例的任務(wù)分配方法,建立多個(gè)優(yōu)先級(jí)隊(duì)列,獲取任務(wù),確定任務(wù)的優(yōu)先級(jí)及優(yōu)先級(jí)隊(duì)列標(biāo)識(shí),按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列,從優(yōu)先級(jí)隊(duì)列中取出任務(wù),存入消息隊(duì)列,下載模塊獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載,從而實(shí)現(xiàn)根據(jù)任務(wù)優(yōu)先級(jí)抓 取信息,從而提高抓取效率。
實(shí)施例3
如圖6所示,本實(shí)施例提供一種任務(wù)分配裝置一種任務(wù)分配裝置,包括:
獲取模塊61,用于獲取任務(wù),任務(wù)包含一個(gè)需要爬蟲抓取的統(tǒng)一資源定位符URL,確定任務(wù)的優(yōu)先級(jí)及優(yōu)先級(jí)隊(duì)列標(biāo)識(shí);
隊(duì)列模塊62,用于建立多個(gè)優(yōu)先級(jí)隊(duì)列;
處理模塊63,用于按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列,從優(yōu)先級(jí)隊(duì)列中取出任務(wù),存入消息隊(duì)列;
下載模塊64,用于獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載。
本實(shí)施例的裝置可以實(shí)現(xiàn)上述方法實(shí)施例的對(duì)應(yīng)步驟,詳細(xì)實(shí)現(xiàn)過程請(qǐng)參照上述方法實(shí)施例步驟11-15及其詳細(xì)實(shí)現(xiàn)過程。
在一個(gè)實(shí)施例中,獲取模塊61具體用于,建立任務(wù),生成隊(duì)列信息,隊(duì)列信息包含任務(wù)的全局唯一id、抓取URL、fetcher_class,并將隊(duì)列信息存入消息隊(duì)列中。
獲取模塊(scheduler)是抓取平臺(tái)的調(diào)度器,作為第一個(gè)模塊,它負(fù)責(zé)配置抓取任務(wù)的相關(guān)信息,獲取任務(wù)的抓取URL,創(chuàng)建隊(duì)列信息(scheduler_doc),并將隊(duì)列信息推送到隊(duì)列模塊之中,供后續(xù)模塊使用。隊(duì)列信息(scheduler_doc)的基本格式設(shè)計(jì)如下:
在一個(gè)實(shí)施例中,處理模塊63包括:任務(wù)調(diào)取單元631、任務(wù)分發(fā)單元632、收取單元633;
隊(duì)列模塊62設(shè)置隊(duì)列優(yōu)先級(jí)別,高優(yōu)先級(jí)的隊(duì)列信息優(yōu)先被任務(wù)調(diào)取單元調(diào)度;
任務(wù)調(diào)取單元631讀取自身配置,根據(jù)任務(wù)調(diào)度策略每隔一段時(shí)間從消息隊(duì)列讀取一定數(shù)量的隊(duì)列信息放入消息隊(duì)列;
任務(wù)分發(fā)單元632向消息隊(duì)列讀取任務(wù),獲得下一個(gè)執(zhí)行的隊(duì)列信息,然后根據(jù)分發(fā)集群的負(fù)載情況,通過Host哈希等負(fù)載均衡LB算法,將該隊(duì)列信息推送給集群中的一個(gè)Fetcher節(jié)點(diǎn)處理,并通過回調(diào)方式獲取隊(duì)列信息的執(zhí)行情況;
收取單元633部署在一個(gè)集群之上,集群中的節(jié)點(diǎn)接收收取單元推送的隊(duì)列信息,分析隊(duì)列信息中fetcher_class(Api/Html/SinaOAthu/Login),調(diào)用對(duì)應(yīng)類型的收取單元去抓取URL數(shù)據(jù),之后通過分析隊(duì)列信息中handler_class(Api/Html/SinaOAthu/Login)信息將抓取返回的數(shù)據(jù)交付指定的下載模塊進(jìn)行后續(xù)處理。
任務(wù)分發(fā)單元負(fù)責(zé)將從消息隊(duì)列中獲得隊(duì)列信息(scheduler_doc),并根據(jù)scheduler_doc中的fetcher_class信息,按照一定的負(fù)載均衡分發(fā)策略將scheduler_doc分發(fā)給任務(wù)分發(fā)單元集群處進(jìn)行抓取,并通過回調(diào)方式獲取該scheduler_doc的執(zhí)行情況。任務(wù)調(diào)取單元內(nèi)部包部會(huì)維護(hù)一個(gè)任務(wù)分發(fā)單元集群的節(jié)點(diǎn)信息,并通過Zookeeper實(shí)時(shí)同步該節(jié)點(diǎn)信息。
具體策略可以為:
按url分發(fā),key為用url生成的一個(gè)hash值。
將key用當(dāng)前狀態(tài)良好的收取(fetcher)節(jié)點(diǎn)數(shù)量取模,得到的數(shù)值即為 fetcher節(jié)點(diǎn)的id。
收取單元負(fù)責(zé)與任務(wù)分發(fā)單元通信,接收派發(fā)的任務(wù)信息,根據(jù)scheduler_doc的fetcher_class字段和url字段信息,調(diào)用特定的fetcher handler去抓取目標(biāo)數(shù)據(jù),之后,將爬取數(shù)據(jù)通過消息隊(duì)列(MQ)交給下游handler處理,向上游的務(wù)分發(fā)單元反饋任務(wù)執(zhí)行情況。為了防止目標(biāo)網(wǎng)站對(duì)爬蟲的限制,收取單元部署在一個(gè)集群之上,集群中每個(gè)節(jié)點(diǎn)有獨(dú)立的對(duì)外IP,并通過zookeeper管理協(xié)調(diào)各個(gè)節(jié)點(diǎn),確保每個(gè)節(jié)點(diǎn)的負(fù)載相對(duì)平穩(wěn)。
主要的fetcher設(shè)計(jì)如下:
在一個(gè)實(shí)施例中,存儲(chǔ)模塊接收收取單元的抓取數(shù)據(jù),根據(jù)隊(duì)列信息的配置信息,對(duì)數(shù)據(jù)采用不同的方法進(jìn)行后續(xù)處理,將需要存儲(chǔ)的數(shù)據(jù)放入Hive/Hbase集群中,并且將新發(fā)現(xiàn)的URL建立新的與父任務(wù)的id一致的隊(duì)列信息,并將新的隊(duì)列信息提交到獲取模塊中,從而進(jìn)行新的一輪處理。
存儲(chǔ)模塊的主要功能是對(duì)上游收取單元抓取的數(shù)據(jù)進(jìn)行處理,包括對(duì)原始數(shù)據(jù)(JSON/HTML)進(jìn)行解析,處理用戶粉絲,轉(zhuǎn)發(fā)評(píng)論列表的翻頁等信息, 通過分析redis中當(dāng)前scheduler_id的緩存數(shù)據(jù),分析得到新的URL,并將解析結(jié)果寫入消息隊(duì)列模塊和hadoop存儲(chǔ)層。
每一個(gè)獲取模塊(scheduler)都與特定的handler對(duì)應(yīng),不同的handler負(fù)責(zé)處理不同的任務(wù),handler內(nèi)部采用鏈?zhǔn)椒绞竭M(jìn)行處理,一個(gè)任務(wù)可以按順序有經(jīng)過多個(gè)handler處理,最終得到所需的數(shù)據(jù),主要handler包含:
Handler還可以對(duì)Hive/Hbase存儲(chǔ)的數(shù)據(jù)直接進(jìn)行offline的處理和挖掘,通過分析用戶、微博等歷史數(shù)據(jù),挖掘整理出有價(jià)值的數(shù)據(jù),供online的抓取使用。
本發(fā)明實(shí)施例的任務(wù)分配裝置,建立多個(gè)優(yōu)先級(jí)隊(duì)列,獲取任務(wù),確定任務(wù)的優(yōu)先級(jí)及優(yōu)先級(jí)隊(duì)列標(biāo)識(shí),按照任務(wù)的優(yōu)先級(jí)隊(duì)列標(biāo)識(shí)將任務(wù)存入對(duì)應(yīng)的優(yōu)先級(jí)隊(duì)列,從優(yōu)先級(jí)隊(duì)列中取出任務(wù),存入消息隊(duì)列,下載模塊獲取消息隊(duì)列存儲(chǔ)的任務(wù),根據(jù)任務(wù)包含的URL進(jìn)行下載,從而實(shí)現(xiàn)根據(jù)任務(wù)優(yōu)先級(jí)抓取信息,從而提高抓取效率。
以上已經(jīng)描述了本發(fā)明的各實(shí)施例,上述說明是示例性的,并非窮盡性的,并且也不限于所披露的各實(shí)施例。在不偏離所說明的各實(shí)施例的范圍和精神的情況下,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說許多修改和變更都是顯而易見的。本文中所用術(shù)語的選擇,旨在最好地解釋各實(shí)施例的原理、實(shí)際應(yīng)用或?qū)κ袌鲋械募夹g(shù)的改進(jìn),或者使本技術(shù)領(lǐng)域的其它普通技術(shù)人員能理解本文披露的各實(shí)施例。
以上所述,僅為本發(fā)明的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求的保護(hù)范圍為準(zhǔn)。