webmagic源碼簡(jiǎn)讀

webmagic半火,一個(gè)簡(jiǎn)潔但功能齊全的爬蟲框架,其官方文檔已經(jīng)非常詳盡钮糖,但偏重于使用,該文從源碼結(jié)構(gòu)以及細(xì)節(jié)上進(jìn)行分析


webmagic組件

webmagic的各個(gè)功能分別通過(guò)組件來(lái)實(shí)現(xiàn)店归,很好的實(shí)現(xiàn)了各功能之間的解耦,主要包括四大組件:Scheduler消痛、Downloader、Pipeline秩伞、PageProcessor逞带,四大組件通過(guò)Spider類進(jìn)行相互協(xié)作完成框架功能

一、Scheduler

抓取url的管理纱新,包含添加待抓取url以及取出需要抓取的url功能展氓,分別通過(guò)push方法和poll方法完成兩項(xiàng)功能,抓取url進(jìn)行了抽象脸爱,以Request進(jìn)行表示遇汞。

實(shí)現(xiàn)類

QueueScheduler:內(nèi)部以LinkedBlockingQueue實(shí)現(xiàn)url隊(duì)列,添加待抓取url直接以queue.add方法實(shí)現(xiàn),取出抓取url以queue.poll實(shí)現(xiàn)勺疼。該類繼承于DuplicateRemovedScheduler教寂,因此有自動(dòng)去重的功能。

PriorityScheduler:以優(yōu)先級(jí)作為取出待抓取url的條件执庐,內(nèi)部以PriorityBlockingQueue作為隊(duì)列的實(shí)現(xiàn),同樣繼承于DuplicateRemovedScheduler导梆,擁有去重功能

二轨淌、PageProcessor

如何對(duì)一個(gè)頁(yè)面內(nèi)容進(jìn)行處理,是用戶主要需要實(shí)現(xiàn)的接口看尼,一般用戶需要實(shí)現(xiàn)對(duì)頁(yè)面內(nèi)容的抽取以及更多待抓取url的獲取

實(shí)現(xiàn)類

SimplePageProcessor:配置一個(gè)url正則表達(dá)式递鹉,自動(dòng)從頁(yè)面內(nèi)容中抽取出對(duì)應(yīng)的url加入抓取隊(duì)列

三、Pipeline

對(duì)PageProcessor的抽取結(jié)果進(jìn)行持久化處理藏斩,比如寫入文件躏结、存入數(shù)據(jù)庫(kù)、或者簡(jiǎn)單的打印到控制臺(tái)

實(shí)現(xiàn)類

ConsolePipeline:直接將結(jié)果輸出到控制臺(tái)

FilePipeline:將抽取結(jié)果寫入文件進(jìn)行持久化

四狰域、Downloader

負(fù)責(zé)對(duì)待抓取的url進(jìn)行下載媳拴,可配置下載線程數(shù)

實(shí)現(xiàn)類

HttpClientDownloader:使用apache HttpClient進(jìn)行頁(yè)面的下載功能,實(shí)現(xiàn)了代理配置功能

輔助類

一兆览、CountableThreadPool

負(fù)責(zé)spider的線程管理屈溉,實(shí)現(xiàn)了一個(gè)堵塞線程池,可以實(shí)時(shí)獲取線程池中正在使用的線程以及等待狀態(tài)的線程數(shù)量抬探,線程數(shù)的統(tǒng)計(jì)以AtomicInteger實(shí)現(xiàn)線程安全子巾,內(nèi)部默認(rèn)的ExecutorService通過(guò)Executors.newFixedThreadPool生成,主要方法execute接受一個(gè)Runnable對(duì)象作為待執(zhí)行任務(wù)小压,線程池中無(wú)可用線程時(shí)會(huì)進(jìn)入阻塞狀態(tài)

二线梗、Proxy

進(jìn)行spider的代理管理,抽取為單獨(dú)的組件可以實(shí)現(xiàn)解耦

三怠益、Selector

實(shí)現(xiàn)對(duì)下載后的頁(yè)面內(nèi)容進(jìn)行選擇的功能仪搔,主要實(shí)現(xiàn)有xpath、css溉痢、regex以及jsonPath

四僻造、Request

對(duì)抓取url的封裝

五、Page

存儲(chǔ)抽取的內(nèi)容以及抓取的url(非線程安全)

配置類

一孩饼、Spider

爬蟲的入口髓削,對(duì)各個(gè)組件進(jìn)行協(xié)調(diào)立膛,包含一個(gè)Downloader宝泵,一個(gè)PageProcessor,一個(gè)Scheduler以及一個(gè)PipeLine列表儿奶,抓取任務(wù)的執(zhí)行線程調(diào)度以CountableThreadPool完成

二闯捎、site

抓取站點(diǎn)的配置,包括域名秉版、ua茬祷、默認(rèn)cookie、默認(rèn)編碼秸妥、默認(rèn)http頭等

webmagic關(guān)于多線程的處理

爬蟲程序必然牽涉到多線程處理以實(shí)現(xiàn)并行的抓取任務(wù)筛峭,在webmagic中主要有三處需要對(duì)多線程情況進(jìn)行處理

Scheduler

在同一時(shí)間可能會(huì)有多個(gè)線程對(duì)Scheduler進(jìn)行操作陪每,webmaigic的QueueScheduler實(shí)現(xiàn)直接以LinkedBlockingQueue解決該問(wèn)題

HttpClientDownloader

在對(duì)httpclient的獲取中檩禾,主要是在生成新的httpClient時(shí)需要進(jìn)行多線程的處理,主要代碼

當(dāng)需要獲取的httpclient不存在時(shí)進(jìn)開始進(jìn)行同步處理饵婆,在同步代碼塊中判斷是否有對(duì)應(yīng)的httpclient存在侨核,如果沒有則生成對(duì)應(yīng)httpclient并加入列表中灌灾,該處使用雙重檢查保證不會(huì)重復(fù)放入httpclient锋喜,進(jìn)行雙重檢測(cè)是由于未對(duì)整個(gè)方法進(jìn)行同步處理豌鸡,目的是為了性能優(yōu)化涯冠,即不會(huì)對(duì)存在相應(yīng)的httpclient進(jìn)行同步逼庞,只對(duì)獲取不到該對(duì)象的情況進(jìn)行同步

Spider

spider負(fù)責(zé)對(duì)整個(gè)抓取過(guò)程進(jìn)行協(xié)調(diào),自然避免不了對(duì)多線程的處理赛糟,該類主要通過(guò)ReentrantLock和Condition進(jìn)行多線程的處理。當(dāng)爬蟲開始執(zhí)行時(shí),spider持續(xù)從scheduler中獲取待抓取的url穆咐,當(dāng)待抓取url為空時(shí)字旭,該線程進(jìn)行等待狀態(tài),通過(guò)waitNewUrl實(shí)現(xiàn)

該阻塞狀態(tài)通過(guò)signalNewUrl方法進(jìn)行解除

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拆讯,隨后出現(xiàn)的幾起案子养叛,更是在濱河造成了極大的恐慌,老刑警劉巖爽室,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阔墩,死亡現(xiàn)場(chǎng)離奇詭異啸箫,居然都是意外死亡艰毒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門蜀肘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稽屏,“玉大人,你說(shuō)我怎么就攤上這事坛增”∧澹” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵罢艾,是天一觀的道長(zhǎng)咐蚯。 經(jīng)常有香客問(wèn)我弄贿,道長(zhǎng)差凹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任能庆,我火速辦了婚禮搁胆,結(jié)果婚禮上邮绿,老公的妹妹穿的比我還像新娘。我一直安慰自己顾腊,他們只是感情好挖胃,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吗垮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怯屉。 梳的紋絲不亂的頭發(fā)上饵沧,一...
    開封第一講書人閱讀 49,798評(píng)論 1 290
  • 那天狼牺,我揣著相機(jī)與錄音,去河邊找鬼失受。 笑死咏瑟,一個(gè)胖子當(dāng)著我的面吹牛码泞,可吹牛的內(nèi)容都是我干的狼犯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼宋舷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祝蝠!你這毒婦竟也來(lái)了幻碱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤儡嘶,失蹤者是張志新(化名)和其女友劉穎蹦狂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凯楔,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啼辣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了党远。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片富弦。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腕柜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盏缤,到底是詐尸還是另有隱情,我是刑警寧澤台舱,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布潭流,位于F島的核電站,受9級(jí)特大地震影響灰嫉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浑厚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一瞻颂、第九天 我趴在偏房一處隱蔽的房頂上張望郑象。 院中可真熱鬧,春花似錦厂榛、人聲如沸丽惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瞳浦,卻和暖如春废士,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矗蕊。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工氢架, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人没龙。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像解滓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洼裤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容