喬士秀 圣文順
(1.德州市市場(chǎng)監(jiān)督管理局 山東省德州市 253500 2.南京工業(yè)大學(xué)浦江學(xué)院 江蘇省南京市 211200)
進(jìn)入21世紀(jì),數(shù)據(jù)成為人類最寶貴的財(cái)富。如今,中國(guó)網(wǎng)民數(shù)量已經(jīng)達(dá)到9億之多。隨意挑選一款互聯(lián)網(wǎng)產(chǎn)品,可能就有幾億的用戶。如何將數(shù)據(jù)有效地檢索并組織呈現(xiàn)出來(lái),有著巨大的應(yīng)用前景。
面對(duì)龐大的數(shù)據(jù)量,如何有效的檢索,并且直觀的展示,就顯得尤為重要。當(dāng)今人們檢索數(shù)據(jù)有兩種方式。使用搜索引擎是最普遍的一種。搜索引擎的出現(xiàn)大大降低了人們獲取數(shù)據(jù)的難度,人們可以輕松地通過檢索關(guān)鍵字獲得所需的數(shù)據(jù)。但是這種通用型爬蟲缺點(diǎn)也是非常明顯的,即無(wú)法獲得特定的數(shù)據(jù)。最具有代表意義的就是每個(gè)網(wǎng)站的robots.txt文件,此文件可以要求通用型搜索引擎哪些資源不能被爬取。部分網(wǎng)站甚至所有內(nèi)容都禁止爬取。用戶就無(wú)法通過搜索引擎獲取到這些信息。而另一種檢索工具是主題網(wǎng)絡(luò)爬蟲[1],優(yōu)勢(shì)就顯得非常明顯。開發(fā)者首先分析目標(biāo)網(wǎng)站的網(wǎng)頁(yè)結(jié)構(gòu)以及API信息,根據(jù)這些信息爬取所有需要的數(shù)據(jù)。之后使用數(shù)據(jù)處理的相關(guān)技術(shù),提取出有價(jià)值的數(shù)據(jù),最終通過可視化技術(shù)把數(shù)據(jù)直觀的展現(xiàn)出來(lái)。由此帶來(lái)了極大的便利。不同領(lǐng)域、不同背景的用戶往往具有不同的檢索目的和需求,通過主題爬蟲,就能完美定制這些個(gè)性化服務(wù)。
網(wǎng)絡(luò)數(shù)據(jù)爬取及展現(xiàn)系統(tǒng)是對(duì)bilibili網(wǎng)站各項(xiàng)數(shù)據(jù)可視化的平臺(tái)。爬蟲設(shè)置定時(shí)任務(wù),每天根據(jù)配置自動(dòng)抓取目標(biāo)信息,并對(duì)數(shù)據(jù)進(jìn)行處理,然后持久化到MySQL數(shù)據(jù)庫(kù)。對(duì)于熱門信息,存儲(chǔ)到Redis數(shù)據(jù)庫(kù),以應(yīng)對(duì)頻繁訪問與數(shù)據(jù)處理,如圖1所示。
用戶通過在可視化網(wǎng)站點(diǎn)擊事件發(fā)送請(qǐng)求,通過接口在數(shù)據(jù)庫(kù)中查詢到相關(guān)數(shù)據(jù),再返回到網(wǎng)站,綁定到相關(guān)元素節(jié)點(diǎn)上。對(duì)于部分?jǐn)?shù)據(jù)設(shè)置自動(dòng)刷新,時(shí)間間隔內(nèi)自動(dòng)向后臺(tái)發(fā)送請(qǐng)求,刷新數(shù)據(jù)到網(wǎng)頁(yè)上,如圖2所示。
系統(tǒng)主要模塊包括:可視化網(wǎng)站、后臺(tái)管理網(wǎng)站、爬蟲系統(tǒng),如圖3所示。
主要包括了bilibili網(wǎng)站基本數(shù)據(jù)展示、bilibili網(wǎng)站視頻信息展示、bilibili網(wǎng)站用戶信息展示模塊。
(1)bilibili網(wǎng)站基本數(shù)據(jù)展示模塊包括:網(wǎng)站實(shí)時(shí)在線人數(shù)、網(wǎng)站實(shí)時(shí)播放人數(shù)、網(wǎng)站每日在線人數(shù)、全站關(guān)鍵詞詞云。
(2)bilibili網(wǎng)站視頻信息展示模塊包括:當(dāng)日熱門視頻排行榜、視頻的具體信息,包括硬幣數(shù)、播放數(shù)、收藏?cái)?shù)、喜愛數(shù)、綜合評(píng)分、投稿人信息、單日以上數(shù)據(jù)分析展示等。
(3)bilibili網(wǎng)站用戶信息展示模塊包括:當(dāng)日最熱用戶排行榜、用戶個(gè)人信息、用戶簡(jiǎn)介、用戶數(shù)據(jù)、用戶視頻排行榜。
主要包括了用戶管理模塊、爬蟲管理模塊。
(1)用戶管理模塊包括:用戶的增加、刪除、修改、更新。
(2)爬蟲管理模塊包括:爬蟲具體狀態(tài)展示、控制爬蟲的運(yùn)行狀態(tài)、爬蟲效率分析。

圖1:爬蟲系統(tǒng)的數(shù)據(jù)流圖

圖2:可視化平臺(tái)的數(shù)據(jù)流圖
主要包括了URL調(diào)度器、下載器、解析器、存儲(chǔ)器、定時(shí)任務(wù)、消息隊(duì)列,如圖4所示。
(1)URL調(diào)度器包括:URL倉(cāng)庫(kù)、爬蟲狀態(tài)管理。
①URL倉(cāng)庫(kù)。所謂URL倉(cāng)庫(kù)就是Redis倉(cāng)庫(kù)[2],即在我們的系統(tǒng)中使用Redis來(lái)保存URL地址列表。只要保證了URL的唯一性,這樣不管我們的爬蟲程序有多少個(gè),最終爬取下來(lái)的數(shù)據(jù)只有一份,不會(huì)重復(fù)。可以在此基礎(chǔ)上實(shí)現(xiàn)爬蟲的分布式。
②爬蟲狀態(tài)管理。通過在Redis中設(shè)置一組變量,爬蟲每次爬取的時(shí)候需要判斷自身是不是處于開啟狀態(tài)。也可以通過后臺(tái)管理系統(tǒng)手動(dòng)控制爬蟲狀態(tài)。
(2)下載器包括:下載HTML頁(yè)面、下載JSON數(shù)據(jù)、IP代理池、反反爬措施
①IP代理池。加入隨機(jī)IP代理主要是為了反反爬蟲。如果有一個(gè)IP代理池,并且可以在構(gòu)建HTTP客戶端時(shí)可以隨機(jī)使用不同的代理,那么對(duì)我們進(jìn)行反反爬蟲則會(huì)由很大的幫助。
這里通過快代理獲取免費(fèi)的IP,并把這些IP保存到Redis的Set數(shù)據(jù)結(jié)構(gòu)[3]中。每次構(gòu)建HTTP客戶端時(shí),會(huì)隨機(jī)從Set集合中隨機(jī)取出一個(gè)元素。如果爬取時(shí)產(chǎn)生請(qǐng)求失敗,就將這一情況記錄下來(lái),當(dāng)超過一定次數(shù)時(shí),再將其從代理池中刪除。

圖3:網(wǎng)絡(luò)數(shù)據(jù)爬取及展現(xiàn)系統(tǒng)的功能模塊圖

圖4:爬蟲架構(gòu)圖
②反反爬措施。對(duì)于每日任務(wù),設(shè)置爬取間隔,降低被目標(biāo)網(wǎng)站封禁的風(fēng)險(xiǎn)。
對(duì)于24小時(shí)不間斷爬蟲,需要設(shè)置IP代理池。
同時(shí)創(chuàng)建HTTP客戶端的時(shí)候需要設(shè)置相關(guān)的頭字段,對(duì)于一些特別的請(qǐng)求,需要根據(jù)時(shí)間動(dòng)態(tài)改變頭字段的值,以應(yīng)對(duì)服務(wù)端的檢查。
(3)解析器。解析器[4]的作用就是把下載的網(wǎng)頁(yè)中對(duì)我們有用的數(shù)據(jù)解析出來(lái),并保存到某個(gè)對(duì)象中,供存儲(chǔ)器進(jìn)一步持久化到數(shù)據(jù)庫(kù)。解析器功能并不復(fù)雜,但是代碼量比較多,比如對(duì)于不同的HTML文本或者JSON數(shù)據(jù)都需要不同的代碼進(jìn)行解析。
當(dāng)然部分下載下來(lái)的文本里還有需要再次爬取的鏈接,我們就需要把這些鏈接保存到下載器隊(duì)列里,以便再次爬取。這一過程稱為抽鏈。
(4)存儲(chǔ)器。把解析好的對(duì)象保存到數(shù)據(jù)庫(kù)中,具體是什么數(shù)據(jù)庫(kù)也可以手動(dòng)設(shè)置,本系統(tǒng)的數(shù)據(jù)庫(kù)為MySQL。
(5)定時(shí)任務(wù)。使用Spring Task作為定時(shí)任務(wù)。部分?jǐn)?shù)據(jù)需要每天爬取并記錄,用于數(shù)據(jù)分析。
(6)消息隊(duì)列。由于將爬蟲分成了url調(diào)度器、下載器、解析器、存儲(chǔ)器,所以為了降低這幾個(gè)組件之間的耦合性,需要這些兩兩之間設(shè)置阻塞隊(duì)列,實(shí)現(xiàn)每個(gè)組件的獨(dú)立運(yùn)行。
(7)多線程。對(duì)于24小時(shí)不間斷爬蟲,每一個(gè)組件都實(shí)現(xiàn)了多線程。由于對(duì)象需要通過Spring Boot創(chuàng)建,因此需要注意多線程對(duì)象必須通過Spring容器對(duì)象獲取。而不能通過注解獲得。
通過分析一個(gè)爬蟲的爬取過程,了解到爬蟲的效率主要取決于下載器的下載的速度,所以本系統(tǒng)給下載器設(shè)置了5個(gè)線程,其它每一個(gè)組件都是單獨(dú)的線程。雖然存儲(chǔ)器與數(shù)據(jù)庫(kù)交互需要時(shí)間,但是插入數(shù)據(jù)時(shí)使用了批量插入操作,并且線程獨(dú)立運(yùn)行。在這種情況下,實(shí)現(xiàn)了爬蟲效率的最大化。
前端使用Vue.js框架[5]構(gòu)建,由于后端分成多個(gè)模塊,每個(gè)模塊都有不同的接口,所以前端請(qǐng)求全部發(fā)送到同一個(gè)端口9001,然后通過Nginx請(qǐng)求[6]轉(zhuǎn)發(fā)到對(duì)象模塊。配置好生產(chǎn)環(huán)境相關(guān)信息,就可以使用相關(guān)命令打包項(xiàng)目。只需要把打包好的文件放到服務(wù)器上即可運(yùn)行。
后端項(xiàng)目全部使用Spring Boot構(gòu)建,只需要使用Maven的package命令就可以生成每個(gè)模塊對(duì)應(yīng)的JAR包,把JAR包放到服務(wù)器上,執(zhí)行命令,即可運(yùn)行后端項(xiàng)目。
爬蟲使用Http Client技術(shù)[7]對(duì)網(wǎng)絡(luò)發(fā)起請(qǐng)求,由于Http Client類似JDBC,寫法比較繁瑣,所以這里對(duì)Http Client進(jìn)行了二次封裝,減少代碼冗余,并且配置Http Client對(duì)象為單例模式,提高效率。核心代碼如下:


圖5:可視化系統(tǒng)首頁(yè)

圖6:視頻詳細(xì)歷史數(shù)據(jù)折線圖可視化頁(yè)面



圖7:爬蟲任務(wù)管理頁(yè)面

網(wǎng)絡(luò)數(shù)據(jù)爬取及展現(xiàn)系統(tǒng)可視化模塊首頁(yè),主要是展示bilibili網(wǎng)站網(wǎng)站當(dāng)前的一些基本信息。首先是所有用戶中,粉絲數(shù)排名最靠前的兩位制作者的數(shù)據(jù)對(duì)比,以及當(dāng)前在線人數(shù),如圖5所示。
點(diǎn)擊導(dǎo)航欄上的視頻按鈕,可以進(jìn)入視頻排行榜頁(yè)面,這個(gè)頁(yè)面會(huì)顯示當(dāng)日排名前20的視頻信息,包括視頻封面、標(biāo)題、所屬分區(qū)等,點(diǎn)擊卡片的每一個(gè)分類,可以進(jìn)入視頻詳情界面,點(diǎn)擊視頻排行榜中的某個(gè)視頻,可以進(jìn)入視頻詳情界面,此頁(yè)面展示了視頻的基本信息和視頻詳細(xì)歷史數(shù)據(jù)的折線圖,如圖6所示。
爬蟲管理模塊主要是對(duì)后臺(tái)的爬蟲狀態(tài)進(jìn)行管理,也可以控制爬蟲的狀態(tài)。爬蟲管理界面展示了當(dāng)前系統(tǒng)爬蟲總個(gè)數(shù)、爬蟲執(zhí)行任務(wù)的次數(shù)、正在運(yùn)行的爬蟲個(gè)數(shù),也可以通過按鈕實(shí)現(xiàn)爬蟲的開關(guān),點(diǎn)擊爬蟲列表頁(yè)面,可以看到爬蟲每一次執(zhí)行任務(wù)的記錄,包含爬蟲的名稱,爬蟲當(dāng)前狀態(tài),爬蟲描述,爬取消耗的時(shí)間等信息。點(diǎn)擊導(dǎo)航欄上的任務(wù)圖表,進(jìn)入爬蟲任務(wù)信息圖中,通過折線圖展示爬蟲每小時(shí)完成的任務(wù)、耗費(fèi)的時(shí)間以及正在執(zhí)行的任務(wù),如圖7所示。
網(wǎng)絡(luò)數(shù)據(jù)爬取及展現(xiàn)系統(tǒng)是基于Java語(yǔ)言開發(fā),在IntelliJ IDEA 2019.2版本基礎(chǔ)上實(shí)現(xiàn)的,依托Tomcat作為WEB服務(wù)器,以MySQL作為后臺(tái)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)存儲(chǔ)。爬蟲在爬取到數(shù)據(jù)以后直接存儲(chǔ)到MySQL數(shù)據(jù)庫(kù)中,之后再使用定時(shí)任務(wù)每天對(duì)數(shù)據(jù)進(jìn)行相關(guān)處理,處理完畢以后把數(shù)據(jù)再次保存新的存儲(chǔ)庫(kù)表中。對(duì)于熱點(diǎn)數(shù)據(jù)或者經(jīng)常需要爬取的數(shù)據(jù)URL,直接存儲(chǔ)到Redis數(shù)據(jù)庫(kù)中,以提高數(shù)據(jù)處理的效率。系統(tǒng)運(yùn)行穩(wěn)定,界面美觀大方,具有較好的實(shí)用性。