喬士秀 圣文順
(1.德州市市場監(jiān)督管理局 山東省德州市 253500 2.南京工業(yè)大學(xué)浦江學(xué)院 江蘇省南京市 211200)
進(jìn)入21世紀(jì),數(shù)據(jù)成為人類最寶貴的財富。如今,中國網(wǎng)民數(shù)量已經(jīng)達(dá)到9億之多。隨意挑選一款互聯(lián)網(wǎng)產(chǎn)品,可能就有幾億的用戶。如何將數(shù)據(jù)有效地檢索并組織呈現(xiàn)出來,有著巨大的應(yīng)用前景。
面對龐大的數(shù)據(jù)量,如何有效的檢索,并且直觀的展示,就顯得尤為重要。當(dāng)今人們檢索數(shù)據(jù)有兩種方式。使用搜索引擎是最普遍的一種。搜索引擎的出現(xiàn)大大降低了人們獲取數(shù)據(jù)的難度,人們可以輕松地通過檢索關(guān)鍵字獲得所需的數(shù)據(jù)。但是這種通用型爬蟲缺點(diǎn)也是非常明顯的,即無法獲得特定的數(shù)據(jù)。最具有代表意義的就是每個網(wǎng)站的robots.txt文件,此文件可以要求通用型搜索引擎哪些資源不能被爬取。部分網(wǎng)站甚至所有內(nèi)容都禁止爬取。用戶就無法通過搜索引擎獲取到這些信息。而另一種檢索工具是主題網(wǎng)絡(luò)爬蟲[1],優(yōu)勢就顯得非常明顯。開發(fā)者首先分析目標(biāo)網(wǎng)站的網(wǎng)頁結(jié)構(gòu)以及API信息,根據(jù)這些信息爬取所有需要的數(shù)據(jù)。之后使用數(shù)據(jù)處理的相關(guān)技術(shù),提取出有價值的數(shù)據(jù),最終通過可視化技術(shù)把數(shù)據(jù)直觀的展現(xiàn)出來。由此帶來了極大的便利。不同領(lǐng)域、不同背景的用戶往往具有不同的檢索目的和需求,通過主題爬蟲,就能完美定制這些個性化服務(wù)。
網(wǎng)絡(luò)數(shù)據(jù)爬取及展現(xiàn)系統(tǒng)是對bilibili網(wǎng)站各項數(shù)據(jù)可視化的平臺。爬蟲設(shè)置定時任務(wù),每天根據(jù)配置自動抓取目標(biāo)信息,并對數(shù)據(jù)進(jìn)行處理,然后持久化到MySQL數(shù)據(jù)庫。對于熱門信息,存儲到Redis數(shù)據(jù)庫,以應(yīng)對頻繁訪問與數(shù)據(jù)處理,如圖1所示。
用戶通過在可視化網(wǎng)站點(diǎn)擊事件發(fā)送請求,通過接口在數(shù)據(jù)庫中查詢到相關(guān)數(shù)據(jù),再返回到網(wǎng)站,綁定到相關(guān)元素節(jié)點(diǎn)上。對于部分?jǐn)?shù)據(jù)設(shè)置自動刷新,時間間隔內(nèi)自動向后臺發(fā)送請求,刷新數(shù)據(jù)到網(wǎng)頁上,如圖2所示。
系統(tǒng)主要模塊包括:可視化網(wǎng)站、后臺管理網(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ù)、網(wǎng)站實時播放人數(shù)、網(wǎng)站每日在線人數(shù)、全站關(guān)鍵詞詞云。
(2)bilibili網(wǎng)站視頻信息展示模塊包括:當(dāng)日熱門視頻排行榜、視頻的具體信息,包括硬幣數(shù)、播放數(shù)、收藏數(shù)、喜愛數(shù)、綜合評分、投稿人信息、單日以上數(shù)據(jù)分析展示等。
(3)bilibili網(wǎng)站用戶信息展示模塊包括:當(dāng)日最熱用戶排行榜、用戶個人信息、用戶簡介、用戶數(shù)據(jù)、用戶視頻排行榜。
主要包括了用戶管理模塊、爬蟲管理模塊。
(1)用戶管理模塊包括:用戶的增加、刪除、修改、更新。
(2)爬蟲管理模塊包括:爬蟲具體狀態(tài)展示、控制爬蟲的運(yùn)行狀態(tài)、爬蟲效率分析。
圖1:爬蟲系統(tǒng)的數(shù)據(jù)流圖
圖2:可視化平臺的數(shù)據(jù)流圖
主要包括了URL調(diào)度器、下載器、解析器、存儲器、定時任務(wù)、消息隊列,如圖4所示。
(1)URL調(diào)度器包括:URL倉庫、爬蟲狀態(tài)管理。
①URL倉庫。所謂URL倉庫就是Redis倉庫[2],即在我們的系統(tǒng)中使用Redis來保存URL地址列表。只要保證了URL的唯一性,這樣不管我們的爬蟲程序有多少個,最終爬取下來的數(shù)據(jù)只有一份,不會重復(fù)。可以在此基礎(chǔ)上實現(xiàn)爬蟲的分布式。
②爬蟲狀態(tài)管理。通過在Redis中設(shè)置一組變量,爬蟲每次爬取的時候需要判斷自身是不是處于開啟狀態(tài)。也可以通過后臺管理系統(tǒng)手動控制爬蟲狀態(tài)。
(2)下載器包括:下載HTML頁面、下載JSON數(shù)據(jù)、IP代理池、反反爬措施
①IP代理池。加入隨機(jī)IP代理主要是為了反反爬蟲。如果有一個IP代理池,并且可以在構(gòu)建HTTP客戶端時可以隨機(jī)使用不同的代理,那么對我們進(jìn)行反反爬蟲則會由很大的幫助。
這里通過快代理獲取免費(fèi)的IP,并把這些IP保存到Redis的Set數(shù)據(jù)結(jié)構(gòu)[3]中。每次構(gòu)建HTTP客戶端時,會隨機(jī)從Set集合中隨機(jī)取出一個元素。如果爬取時產(chǎn)生請求失敗,就將這一情況記錄下來,當(dāng)超過一定次數(shù)時,再將其從代理池中刪除。
圖3:網(wǎng)絡(luò)數(shù)據(jù)爬取及展現(xiàn)系統(tǒng)的功能模塊圖
圖4:爬蟲架構(gòu)圖
②反反爬措施。對于每日任務(wù),設(shè)置爬取間隔,降低被目標(biāo)網(wǎng)站封禁的風(fēng)險。
對于24小時不間斷爬蟲,需要設(shè)置IP代理池。
同時創(chuàng)建HTTP客戶端的時候需要設(shè)置相關(guān)的頭字段,對于一些特別的請求,需要根據(jù)時間動態(tài)改變頭字段的值,以應(yīng)對服務(wù)端的檢查。
(3)解析器。解析器[4]的作用就是把下載的網(wǎng)頁中對我們有用的數(shù)據(jù)解析出來,并保存到某個對象中,供存儲器進(jìn)一步持久化到數(shù)據(jù)庫。解析器功能并不復(fù)雜,但是代碼量比較多,比如對于不同的HTML文本或者JSON數(shù)據(jù)都需要不同的代碼進(jìn)行解析。
當(dāng)然部分下載下來的文本里還有需要再次爬取的鏈接,我們就需要把這些鏈接保存到下載器隊列里,以便再次爬取。這一過程稱為抽鏈。
(4)存儲器。把解析好的對象保存到數(shù)據(jù)庫中,具體是什么數(shù)據(jù)庫也可以手動設(shè)置,本系統(tǒng)的數(shù)據(jù)庫為MySQL。
(5)定時任務(wù)。使用Spring Task作為定時任務(wù)。部分?jǐn)?shù)據(jù)需要每天爬取并記錄,用于數(shù)據(jù)分析。
(6)消息隊列。由于將爬蟲分成了url調(diào)度器、下載器、解析器、存儲器,所以為了降低這幾個組件之間的耦合性,需要這些兩兩之間設(shè)置阻塞隊列,實現(xiàn)每個組件的獨(dú)立運(yùn)行。
(7)多線程。對于24小時不間斷爬蟲,每一個組件都實現(xiàn)了多線程。由于對象需要通過Spring Boot創(chuàng)建,因此需要注意多線程對象必須通過Spring容器對象獲取。而不能通過注解獲得。
通過分析一個爬蟲的爬取過程,了解到爬蟲的效率主要取決于下載器的下載的速度,所以本系統(tǒng)給下載器設(shè)置了5個線程,其它每一個組件都是單獨(dú)的線程。雖然存儲器與數(shù)據(jù)庫交互需要時間,但是插入數(shù)據(jù)時使用了批量插入操作,并且線程獨(dú)立運(yùn)行。在這種情況下,實現(xiàn)了爬蟲效率的最大化。
前端使用Vue.js框架[5]構(gòu)建,由于后端分成多個模塊,每個模塊都有不同的接口,所以前端請求全部發(fā)送到同一個端口9001,然后通過Nginx請求[6]轉(zhuǎn)發(fā)到對象模塊。配置好生產(chǎn)環(huán)境相關(guān)信息,就可以使用相關(guān)命令打包項目。只需要把打包好的文件放到服務(wù)器上即可運(yùn)行。
后端項目全部使用Spring Boot構(gòu)建,只需要使用Maven的package命令就可以生成每個模塊對應(yīng)的JAR包,把JAR包放到服務(wù)器上,執(zhí)行命令,即可運(yùn)行后端項目。
爬蟲使用Http Client技術(shù)[7]對網(wǎng)絡(luò)發(fā)起請求,由于Http Client類似JDBC,寫法比較繁瑣,所以這里對Http Client進(jìn)行了二次封裝,減少代碼冗余,并且配置Http Client對象為單例模式,提高效率。核心代碼如下:
圖5:可視化系統(tǒng)首頁
圖6:視頻詳細(xì)歷史數(shù)據(jù)折線圖可視化頁面
圖7:爬蟲任務(wù)管理頁面
網(wǎng)絡(luò)數(shù)據(jù)爬取及展現(xiàn)系統(tǒng)可視化模塊首頁,主要是展示bilibili網(wǎng)站網(wǎng)站當(dāng)前的一些基本信息。首先是所有用戶中,粉絲數(shù)排名最靠前的兩位制作者的數(shù)據(jù)對比,以及當(dāng)前在線人數(shù),如圖5所示。
點(diǎn)擊導(dǎo)航欄上的視頻按鈕,可以進(jìn)入視頻排行榜頁面,這個頁面會顯示當(dāng)日排名前20的視頻信息,包括視頻封面、標(biāo)題、所屬分區(qū)等,點(diǎn)擊卡片的每一個分類,可以進(jìn)入視頻詳情界面,點(diǎn)擊視頻排行榜中的某個視頻,可以進(jìn)入視頻詳情界面,此頁面展示了視頻的基本信息和視頻詳細(xì)歷史數(shù)據(jù)的折線圖,如圖6所示。
爬蟲管理模塊主要是對后臺的爬蟲狀態(tài)進(jìn)行管理,也可以控制爬蟲的狀態(tài)。爬蟲管理界面展示了當(dāng)前系統(tǒng)爬蟲總個數(shù)、爬蟲執(zhí)行任務(wù)的次數(shù)、正在運(yùn)行的爬蟲個數(shù),也可以通過按鈕實現(xiàn)爬蟲的開關(guān),點(diǎn)擊爬蟲列表頁面,可以看到爬蟲每一次執(zhí)行任務(wù)的記錄,包含爬蟲的名稱,爬蟲當(dāng)前狀態(tài),爬蟲描述,爬取消耗的時間等信息。點(diǎn)擊導(dǎo)航欄上的任務(wù)圖表,進(jìn)入爬蟲任務(wù)信息圖中,通過折線圖展示爬蟲每小時完成的任務(wù)、耗費(fèi)的時間以及正在執(zhí)行的任務(wù),如圖7所示。
網(wǎng)絡(luò)數(shù)據(jù)爬取及展現(xiàn)系統(tǒng)是基于Java語言開發(fā),在IntelliJ IDEA 2019.2版本基礎(chǔ)上實現(xiàn)的,依托Tomcat作為WEB服務(wù)器,以MySQL作為后臺數(shù)據(jù)庫進(jìn)行數(shù)據(jù)存儲。爬蟲在爬取到數(shù)據(jù)以后直接存儲到MySQL數(shù)據(jù)庫中,之后再使用定時任務(wù)每天對數(shù)據(jù)進(jìn)行相關(guān)處理,處理完畢以后把數(shù)據(jù)再次保存新的存儲庫表中。對于熱點(diǎn)數(shù)據(jù)或者經(jīng)常需要爬取的數(shù)據(jù)URL,直接存儲到Redis數(shù)據(jù)庫中,以提高數(shù)據(jù)處理的效率。系統(tǒng)運(yùn)行穩(wěn)定,界面美觀大方,具有較好的實用性。