• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于Go 的多線程模塊化爬蟲框架設(shè)計(jì)與實(shí)現(xiàn)

      2019-08-21 03:50:54劉國(guó)璽劉江徐海峰張雁呂丹桔
      現(xiàn)代計(jì)算機(jī) 2019年21期
      關(guān)鍵詞:解析器分析器爬蟲

      劉國(guó)璽,劉江,徐海峰,張雁,呂丹桔

      (西南林業(yè)大學(xué)大數(shù)據(jù)與智能工程學(xué)院,昆明650224)

      0 引言

      隨著大數(shù)據(jù)時(shí)代的到來(lái),數(shù)據(jù)變得越來(lái)越重要[1]。在日常學(xué)習(xí)和科技研究中,往往需要大量數(shù)據(jù)支撐,然而數(shù)據(jù)獲取并不是一件容易的事情。網(wǎng)絡(luò)爬蟲是人們最常用的一種獲取網(wǎng)絡(luò)數(shù)據(jù)的方式,網(wǎng)絡(luò)爬蟲是一個(gè)經(jīng)過(guò)設(shè)計(jì)專門從萬(wàn)維網(wǎng)上下載網(wǎng)頁(yè)并對(duì)網(wǎng)頁(yè)進(jìn)行分析的程序[2]。它將下載的網(wǎng)頁(yè)和收集到的信息存儲(chǔ)在本地用于研究和開發(fā)。網(wǎng)絡(luò)爬蟲的工作原理是從一個(gè)或若干初始網(wǎng)頁(yè)的鏈接出發(fā)進(jìn)而得到下一個(gè)鏈接隊(duì)列的過(guò)程;伴隨著網(wǎng)頁(yè)的抓取又不斷從抓取到的網(wǎng)頁(yè)里抽取新的鏈接放入到鏈接隊(duì)列中,直到爬蟲程序滿足系統(tǒng)中某一條件時(shí)停止[3]。爬蟲腳本的實(shí)例多種多樣,但基本流程都是請(qǐng)求HTML 頁(yè)面、從頁(yè)面中分析并保存需要的文本信息、URL 管理和下載靜態(tài)資源。利用爬蟲的有規(guī)律的特點(diǎn),本文擬設(shè)計(jì)一個(gè)基于Go 的多線程模塊化爬蟲框架,能夠提高網(wǎng)絡(luò)爬蟲的效率,可以在進(jìn)行二次開發(fā)時(shí),減少開發(fā)人員大量重復(fù)的代碼編寫,提高開發(fā)效率。

      1 總體架構(gòu)設(shè)計(jì)

      基于模塊化的思想,本文把爬蟲業(yè)務(wù)抽象為三個(gè)大模塊,即URL 管理、頁(yè)面分析和文件下載。每個(gè)模塊內(nèi)部又抽象出一個(gè)或多個(gè)模塊,每個(gè)模塊只負(fù)責(zé)處理一項(xiàng)簡(jiǎn)單的事務(wù),由一個(gè)或多個(gè)協(xié)程(goroutine)來(lái)負(fù)責(zé)執(zhí)行,模塊與模塊之間采用專用數(shù)據(jù)通道(channel)傳輸數(shù)據(jù)[4]。此設(shè)計(jì)方案降低了模塊間的耦合性,使多個(gè)模塊可以方便地自由組合,協(xié)程也由原有的長(zhǎng)途跋涉(處理一連串的事務(wù))變?yōu)槎鄠€(gè)短跑運(yùn)動(dòng)(一個(gè)協(xié)程只負(fù)責(zé)反復(fù)執(zhí)行單個(gè)任務(wù)),原來(lái)繁瑣的線程變成了容易控制的協(xié)程,線程間通信也變得十分的輕松,并且可以通過(guò)設(shè)置不同步驟的協(xié)程數(shù)量來(lái)優(yōu)化整體的效率。

      總體架構(gòu)主要分為:URL 管理器、頁(yè)面分析器、文件下載器,如圖1 所示(圖中實(shí)線矩形表示一個(gè)操作,可設(shè)置獨(dú)立的一個(gè)或多個(gè)協(xié)程負(fù)責(zé)執(zhí)行,箭頭表示協(xié)程間通信的專用數(shù)據(jù)通道)。

      在圖1 中,所有模塊之間都是用通道連接,這些單向通道可視作接口。每個(gè)模塊只負(fù)責(zé)處理傳入通道的數(shù)據(jù)而不在乎是誰(shuí)傳入的。這樣每個(gè)模塊都有很強(qiáng)的封裝性,模塊間耦合性極大降低,模塊的復(fù)用性和可替代性也極大增強(qiáng)。

      1.1 URL管理器

      在爬蟲中如果遇到同一模板渲染,URL 雖有一定規(guī)律,但是有些部分無(wú)法通過(guò)腳本自動(dòng)生成[5]。例如:http:www.xxx.com/xx?id=加一串隨機(jī)無(wú)規(guī)則字符串,很難一次性鎖定要爬取的所有頁(yè)面所對(duì)應(yīng)的URL。此時(shí)常用的辦法就是建立匹配規(guī)則,定義一個(gè)或多個(gè)初始頁(yè)面,每爬取一個(gè)頁(yè)面都用匹配規(guī)則查找所有符合規(guī)則的鏈接,如此往復(fù)尋找就可以找到很多匹配的頁(yè)面。URL 管理器主要由HTML 鏈接提取器和URL 分配器組成[6]。HTML 分配器可以解析通過(guò)數(shù)據(jù)通道傳入的HTML 數(shù)據(jù),提取并還原其中所有a 標(biāo)簽的鏈接,然后將鏈接傳給URL 分配器。URL 分配器接收到URL 后,將URL 根據(jù)用戶定義的匹配規(guī)則(匹配規(guī)則與頁(yè)面分析器一一對(duì)應(yīng))分配給匹配的頁(yè)面分析器。

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

      1.2 頁(yè)面分析器

      在網(wǎng)頁(yè)爬取過(guò)程中請(qǐng)求和頁(yè)面分析是必不可少的步驟。頁(yè)面請(qǐng)求就是通過(guò)URL 獲取對(duì)應(yīng)的數(shù)據(jù),一般是一個(gè)HTML 文件。頁(yè)面分析就是提取頁(yè)面請(qǐng)求所得到的東西中的有效數(shù)據(jù)的一個(gè)過(guò)程[7]。用戶需求不同或者頁(yè)面的變化都會(huì)導(dǎo)致分析步驟的不同,此步驟不能統(tǒng)一封裝的,只能給開發(fā)者提供一個(gè)接口,通過(guò)執(zhí)行開發(fā)者所傳入的方法分析頁(yè)面,解析出需要的數(shù)據(jù)。另外在Go 語(yǔ)言中方法可以像變量一樣傳遞,開發(fā)者能快速上手。

      圖2 頁(yè)面分析器結(jié)構(gòu)示意圖

      如圖2 所示頁(yè)面分析器主要由URL 檢查器、HTML 下載器、HTML 解析器組成。每個(gè)頁(yè)面分析器都由一個(gè)map 保存已經(jīng)抓取過(guò)的URL,當(dāng)有新的URL 通過(guò)URL 通道傳入,URL 檢查器都會(huì)檢查這個(gè)URL 是否已經(jīng)存在于map 中,避免重復(fù)抓取相同數(shù)據(jù)。如果沒(méi)有重復(fù),URL 檢查器會(huì)把這個(gè)URL 傳給HTML 下載器。HTML 下載器通過(guò)URL 下載相應(yīng)的HTML 頁(yè)面,然后傳遞給HTML 解析器。HTML 解析器執(zhí)行用戶傳入的解析方法,解析HTML 數(shù)據(jù)并把頁(yè)面對(duì)應(yīng)的URL添加到已爬取URL 列表中。HTML 解析器是整個(gè)分析器的核心,同時(shí)也是整個(gè)系統(tǒng)的控制中心[8]。在解析方法中用戶可以使用其他Go 語(yǔ)言的HTML 解析方式如goquery、正則匹配等解析HTML 獲取自己需要的數(shù)據(jù),也可以自己定義解析方式。同時(shí)也可以執(zhí)行數(shù)據(jù)存儲(chǔ)操作如把數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)或者文本。HTML 解析器是控制中心是因?yàn)椋菏褂肬RL 管理器,只需要把HTML或者URL 傳給URL 解析器;下載文件,只需要把URL傳遞給初始化好的資源文件下載器。

      頁(yè)面分析器針對(duì)當(dāng)前大多數(shù)網(wǎng)站使用視圖模板,結(jié)構(gòu)相似的網(wǎng)頁(yè)對(duì)應(yīng)一個(gè)頁(yè)面分析器,根據(jù)本文設(shè)計(jì)方案不同頁(yè)面分析器的主要區(qū)別就是傳入的解析方法不同,用戶根據(jù)自己需要抓取的網(wǎng)頁(yè)和數(shù)據(jù)設(shè)計(jì)解析方法通過(guò)接口傳入頁(yè)面解析器執(zhí)行,最終實(shí)現(xiàn)頁(yè)面的解析。

      1.3 資源文件下載器

      網(wǎng)絡(luò)爬蟲的根本目的是獲取需要的數(shù)據(jù)。這些數(shù)據(jù)大致可分為文本數(shù)據(jù)和靜態(tài)資源數(shù)據(jù)兩大類[7]。文本數(shù)據(jù)是指嵌套在頁(yè)面中的數(shù)據(jù),如某公司首頁(yè)的文字說(shuō)明、公司名稱等。靜態(tài)資源數(shù)據(jù)主要是音頻文件、視頻文件、圖片文件等。文本數(shù)據(jù)的獲取可以通過(guò)頁(yè)面分析器實(shí)現(xiàn),資源數(shù)據(jù)和頁(yè)面一樣也有指向文件的URL 地址[8]。靜態(tài)資源文件的流程就是通過(guò)URL 解析下載資源,然后以某個(gè)文件名存儲(chǔ)在硬盤中的某位置。將此過(guò)程封裝為“一個(gè)下載器”,開發(fā)者只需提供存儲(chǔ)路徑、URL 等參數(shù),根據(jù)硬件資源設(shè)置線程數(shù)就可以完成下載,不必考慮多線程等問(wèn)題。

      資源下載器的完成的任務(wù)就是:檢查傳入的URL,下載URL 對(duì)應(yīng)文件并保存在用戶指定的位置。

      2 基于Go的多線程實(shí)現(xiàn)

      前面提到本系統(tǒng)采用模塊化設(shè)計(jì),一個(gè)模塊只負(fù)責(zé)處理單個(gè)簡(jiǎn)單的邏輯事務(wù),每個(gè)模塊可以由一個(gè)或多個(gè)獨(dú)立的協(xié)程負(fù)責(zé)運(yùn)作,這樣一個(gè)協(xié)程也由原來(lái)的處理一連串的事務(wù)變?yōu)橹回?fù)責(zé)反復(fù)執(zhí)行單個(gè)任務(wù)。在一連串的事務(wù)處理中常常會(huì)因?yàn)槟骋徊襟E而導(dǎo)致線程阻塞,優(yōu)化起來(lái)很難[9]。在本模型中只需優(yōu)化阻塞的任務(wù)模型,甚至可以給阻塞任務(wù)多開幾個(gè)協(xié)程,就可以使整個(gè)流程變得流暢。熟悉多線程編程的用戶一定會(huì)發(fā)現(xiàn)這種模型的弊端:切換線程是有高性能代價(jià)的,這也是本系統(tǒng)選擇用Go 語(yǔ)言實(shí)現(xiàn)的一個(gè)重要原因。在Go 中本文協(xié)程來(lái)取代線程,把協(xié)程看做線程的一種封裝,一個(gè)四線程的CPU 最多可以同時(shí)執(zhí)行四個(gè)線程操作[10]。在普通的多線程操作中需要頻繁切換線程,在Go 中默認(rèn)所有g(shù)oroutine(協(xié)程)會(huì)在一個(gè)原生線程里運(yùn)行。在同一個(gè)原生線程里,默認(rèn)如果當(dāng)前協(xié)程不發(fā)生阻塞,該協(xié)程就不會(huì)讓出時(shí)間給其他同線程的協(xié)程。如果發(fā)生阻塞,線程會(huì)把CPU 時(shí)間讓給其他協(xié)程而不切換線程,而切換和創(chuàng)建協(xié)程的性能代價(jià)遠(yuǎn)遠(yuǎn)低于線程的切換和創(chuàng)建,大大降低了頻繁切換協(xié)程對(duì)性能的影響[11]。

      文本有效實(shí)現(xiàn)了爬蟲的多線程退出方法,在Go 語(yǔ)言中,建立了一個(gè)Waitgroup 實(shí)例,每添加一個(gè)任務(wù)調(diào)用一次Waitgroup.Add 方法;每執(zhí)行完一次任務(wù)調(diào)用一次Waitgroup.Done 方法。當(dāng)Waitgroup 實(shí)例中任務(wù)數(shù)量降到0 時(shí)就會(huì)結(jié)束所有協(xié)程。

      3 實(shí)驗(yàn)結(jié)果分析

      文本實(shí)現(xiàn)的爬蟲軟件測(cè)試環(huán)境如下:

      操作系統(tǒng):Win10 專業(yè)版;CPU:Intel i5 4700M;網(wǎng)絡(luò)帶寬:100MB。在此設(shè)計(jì)方案下進(jìn)行頁(yè)面爬取實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果如下:

      (1)普通多線程爬蟲

      表1 普通多線程爬蟲

      (2)基于Go 的模塊化爬蟲

      表2 基于Go 的模塊化爬蟲

      在相同運(yùn)行環(huán)境下,執(zhí)行相同任務(wù)時(shí),在爬取頁(yè)面效率上,基于Go 的模塊化爬蟲比普通多線程爬蟲有所提升。對(duì)于開發(fā)效率,基于Go 的多線程由于進(jìn)行模塊化封裝比普通多線程在性能、開發(fā)和調(diào)試效率上都有很大提升,實(shí)驗(yàn)中,如表1 和表2 所示,編程所需時(shí)間由120min 降低為25min,開發(fā)效率明顯提高。開發(fā)者在爬取其他網(wǎng)站時(shí),只需要對(duì)頁(yè)面解析方法進(jìn)行設(shè)計(jì),通過(guò)解析器接口傳入解析器執(zhí)行。基于本文設(shè)計(jì)的爬蟲框架下,進(jìn)行二次開發(fā),不僅可以減少大量的代碼編寫,提高開發(fā)者效率;而且可以減少開發(fā)者在開發(fā)過(guò)程中的重復(fù)性工作,避免開發(fā)過(guò)程的反復(fù)。

      4 結(jié)語(yǔ)

      模塊化爬蟲設(shè)計(jì),可以把復(fù)雜邏輯抽象成多個(gè)簡(jiǎn)單任務(wù)模塊,采用協(xié)程和任務(wù)綁定的編程思路,不僅可以用在爬蟲程序中,也可以用在其他一些結(jié)構(gòu)化的事務(wù)處理中。本文設(shè)計(jì)了一個(gè)方案把爬蟲基本流程進(jìn)行模塊化封裝,為開發(fā)者提供一個(gè)可控的并且能夠支持多線程的集頁(yè)面請(qǐng)求、資源下載、URL 重復(fù)檢查管理等基本功能的開發(fā)包,便于開發(fā)者使用以及避免開發(fā)過(guò)程中的反復(fù)造輪子。除此之外,基于Go 的模塊化爬蟲設(shè)計(jì)可以降低模塊間耦合性,增強(qiáng)模塊的復(fù)用性和可替代性。

      猜你喜歡
      解析器分析器爬蟲
      利用網(wǎng)絡(luò)爬蟲技術(shù)驗(yàn)證房地產(chǎn)灰犀牛之說(shuō)
      基于多解析器的域名隱私保護(hù)機(jī)制
      基于Python的網(wǎng)絡(luò)爬蟲和反爬蟲技術(shù)研究
      基于Wireshark的列控中心以太網(wǎng)通信協(xié)議解析器的研究與實(shí)現(xiàn)
      酒精分析器為什么能分辨人是否喝過(guò)酒
      如何防御DNS陷阱?常用3種DNS欺騙手法
      利用爬蟲技術(shù)的Geo-Gnutel la VANET流量采集
      一種基于無(wú)關(guān)DNS的通信隱私保護(hù)技術(shù)研究
      電子世界(2018年14期)2018-04-15 16:14:25
      多邊形電極線形離子阱質(zhì)量分析器的結(jié)構(gòu)與性能
      應(yīng)用于詞法分析器的算法分析優(yōu)化
      舟山市| 兴城市| 合江县| 阿克苏市| 星子县| 彰化县| 名山县| 四平市| 宁强县| 太湖县| 卢湾区| 淮安市| 台北市| 古田县| 怀来县| 莒南县| 宁蒗| 和平区| 丰台区| 乡城县| 奉贤区| 会泽县| 通州市| 巴彦淖尔市| 新营市| 鲁甸县| 通州区| 云南省| 宜川县| 菏泽市| 聂拉木县| 长寿区| 望江县| 富川| 中方县| 景东| 云梦县| 新闻| 商洛市| 福建省| 鲁山县|