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

圖1:爬蟲系統的數據流圖

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

圖3:網絡數據爬取及展現系統的功能模塊圖

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


圖5:可視化系統首頁

圖6:視頻詳細歷史數據折線圖可視化頁面



圖7:爬蟲任務管理頁面

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