林文濤,陳偉強,劉杭燕,葉 楠
(福州理工學院工學院,福州 350506)
在這信息如此龐雜的時代要使熱點新聞信息更易于查詢,易于獲取。用爬蟲程序實現熱點新聞高效、快速而便捷的獲取與整合。通過建立網站的方式來展示獲取的新聞信息。為了讓用戶定制個人信息獲取偏好、保存歷史記錄等功能,而編寫了用戶模塊[1-2]。
網絡爬蟲是通過程序或腳本借助現有爬蟲技術或工具編寫的系統(tǒng),該系統(tǒng)將有目的性的自動抓取互聯網信息[3]。網絡檢索功能起于互聯網內容爆炸性發(fā)展所帶來的對內容檢索的需求。搜素引擎不斷發(fā)展,人們的需求也不斷提高,網絡信息搜索已經成為人們每天都有進行的內容。如何使搜索引擎能夠時刻滿足人們的需求?最初的檢索功能通過索引站的方式實現,從而有了網絡機器人[4]。本項目來源于新聞爬蟲系統(tǒng)項目的建設,旨在為相關機構或個人提供及時的網絡信息服務。
(1)利用Python語言結合該語言的相關庫或技術如Requests/urllib等編寫爬蟲系統(tǒng)[5]。系統(tǒng)可以定期的對幾個大型的新聞發(fā)布平臺進行廣度優(yōu)先的爬取策略來增量獲取新聞數據。
(2)采用Xpath/Re/BeautifulSoup庫對獲取到的新聞數據進行關鍵字段提取。其中關鍵字段有新聞標題、編輯者、發(fā)布平臺、發(fā)布時間等,之后再將這些關鍵字段與新聞圖片、正文內容一并存儲與本地,等待進一步操作。
(3)使用python的pymysql庫對MySQL數據庫進行對接。
(4)通過Flask web框架構建網站,負責為用戶需求而控制和調度相應的模塊以及對MySQL數據庫中資源的調用與整合,為實現前端頁面的對接實現不同使用場景下的多種數據請求接口:由用戶通過URL請求時,服務器端將直接返回相應的HTML頁面;若碰到特殊的需求需要使用異步傳輸時,將返回以JSON格式封裝的數據,在前端通過JavaScript腳本語言對其進行相應處理。
(5)前端界面利用Python的Jinja2模板引擎以及Bootstrap/AJAX/JQurey等相關技術實現,兼顧用戶交互方式的多樣性以及系統(tǒng)的跨瀏覽器兼容性。
本文中的基于網絡爬蟲的熱點新聞發(fā)布系統(tǒng)可以簡單的理解為,對新聞發(fā)布平臺的眾多的新聞頁面格式化——根據需要提取該新聞頁面中的關鍵信息。因此,為了讓程序更加易讀、更容易拓展,在爬蟲設計之初先編寫了一個Website類,供后續(xù)爬蟲程序拓展。
圖1 Website類圖
在此類中根據系統(tǒng)需要,主要提取新聞頁面的鏈接、新聞發(fā)布時間、新聞標題、新聞來源、新聞編輯、新聞內容、新聞類型。根據上述程序,針對相應的新聞發(fā)布平臺編寫相應的爬蟲類實現Website類中的抽象方法。其中,getLinks()與fromRank()方法用于在對應新聞發(fā)布平臺遍歷新聞頁面。當后續(xù)程序需要批量爬取新聞頁面時只需調用getParams()方法即可。
在本系統(tǒng)中,數據獲取依賴于python編寫的網絡爬蟲,爬蟲程序基于Requests來發(fā)起對新聞發(fā)布平臺的請求,獲取返回的HTML頁面,之后通過Xpath(XML路徑語言)與python內置的re(正則表達式)庫編寫定位HTML上關鍵字段的爬取邏輯,將新聞的標題、來源、編輯者、存儲路徑、發(fā)布時間、新聞類別等字段存儲進MySQL,新聞內容與新聞圖片存儲到本地中。由此即可編寫一個針對新聞信息的可擴展爬蟲程序。
爬蟲程序主要由鏈接過濾子模塊、頁面解析子模塊、爬行控制子模塊以及數據存儲子模塊構成,其模塊結構如圖2所示:
3.1.1 鏈接過濾子模塊
圖2 數據獲取功能模塊結構圖
本系統(tǒng)的爬蟲程序運行過程中,將會不斷往URL隊列中添加新的URL鏈接,其中某些URL鏈接可能并不是程序所需要的。因此這時候就需要再編寫一個用于過濾URL鏈接的過濾器。對于這個過濾器只有某些條件符合的URL才能進入待爬URL隊列,將其余不符合條件的URL剔除,不會加入到待抓取的爬行隊列中。同時對于符合條件的URL也要判斷該URL是否被爬取過,如果已被爬過則舍棄。
在爬蟲程序中使用鏈接過濾器對URL進行過濾是有必要的。由于大量不符合條件的URL被過濾掉了,爬行隊列中僅僅加入符合條件的URL,充分節(jié)省了寶貴的內存空間。鏈接過濾子模塊的工作方式如圖3所示:
圖3 鏈接過濾子模塊
3.1.2 頁面解析子模塊
通過鏈接過濾子模塊過濾獲取的URL隊列,傳輸進此模塊。頁面解析子模塊將會對URL隊列中的鏈接逐一解析,解析過程是通過Xpath(XML路徑語言)定位頁面中需要抽取消息的具體位置,后獲取該信息并存儲進數據庫。但是有些URL即使通過了過濾器子模塊,也會因為排版的些許差異而使得Xpath無法定位,這是就需要有相應的程序來檢測這樣的URL。頁面解析子模塊的工作方式如圖4所示:
圖4 頁面解析子模塊
3.1.3 爬取策略子模塊
爬取策略模塊是整個爬蟲程序的核心,它控制著整個爬蟲的抓取策略(寬度優(yōu)先或者深度優(yōu)先)以及停止條件。爬行控制子模塊的工作流程如圖5所示:
圖5 爬行控制子模塊
3.1.4 數據存儲子模塊
對HTML頁面進行解析后,獲得的關鍵字段,將會存儲于數據庫中,而新聞內容與新聞圖片將會被整合存儲為本地文件。數據存儲子模塊的工作流程如圖6所示:
系統(tǒng)可視化功能模塊的主要功能結構如圖7所示,通過ExtJS結合Google Visualization API進行構建,其主要功能包括:首頁新聞推薦:登錄網站后首頁將是按熱度排序推薦的新聞條目;按類型查看:查看特定類型的新聞;按時間查看:查看某個時間段的新聞:通過關鍵字檢索:輸入關鍵字檢索查看當前符合條件的新聞;每日新聞增量:查看近20天每日新增新聞的數量;當日新聞詞頻分析:查看發(fā)布日期為當日的新聞的詞頻分析柱狀圖;關鍵字檢索查看每日詞頻變化折線圖:數日某個關鍵字,獲取該詞近20日的詞頻變化。
圖6 數據存儲子模塊
圖7 數據可視化功能結構圖
圖8 網站首頁
該系統(tǒng)的運行的性能會受到實驗機器的網絡與機器硬件性能的影響,本節(jié)列舉測試環(huán)境。
表1 硬件環(huán)境
由于條件限制,在測試系統(tǒng)時,本文只使用兩臺機器。
表2 軟件環(huán)境
在項目完成后需要對系統(tǒng)是否符合最初的需求做出一定的測試,系統(tǒng)測試就是對當前整個項目的檢驗。檢查項目中的不足的地方。之后再進一步優(yōu)化系統(tǒng)。本節(jié)將依據系統(tǒng)測試規(guī)則設計一系列測試用例,以系統(tǒng)測試的一般方法來測試新聞爬蟲系統(tǒng)。
發(fā)現系統(tǒng)中的漏洞與缺陷是軟件測試的主要目的,軟件測試在軟件的整個開發(fā)過程中也占據著舉足輕重的地位。因此本節(jié)對系統(tǒng)關鍵功能設計相應的測試用例:數據爬取模塊爬取數據;數據爬取模塊周期爬取數據;數據可視化模塊分析圖;數據可視化模塊新聞內容展現;數據可視化模塊關鍵字檢索近期詞頻變化。
根據測試用例將設計相應的預設條件、輸入、操作步驟以及預期輸出以判斷相應功能模塊能否正常運行,如表3所示:
表3 測試用例一
在測試用例的幫助下對整個系統(tǒng)進行了詳盡的測試,之后對于各別測試不通過的系統(tǒng)功能模塊的測試結果分析,獲得照成測試不通過的原因,對其中照成錯誤的代碼進行仔細的調試與修改。在之后對功能模塊不斷的整合解耦下終于使得所有測試用例都通過了考驗,均達到了測試的預期結果。
在這網絡高度發(fā)達的時代,每日信息都在爆炸式的增長。而對于如何獲取其中有用的信息也越來越被人們所重視,對于此網絡爬蟲正扮演著越來越重要的角色,它將成為分析信息數據的利器。本文所設計實現的新聞爬蟲系統(tǒng),參考綜合了現在主流的幾種爬蟲技術路線。通過編寫爬蟲程序實現了對于新聞內容、標題、發(fā)布時間等數據的抓取,使用Chart.js結合Python的Jinja2模板引擎以及Bootstrap/AJAX/JQurey等相關技術實現了數據可視化功能,兼顧用戶交互方式的多樣性以及系統(tǒng)的跨瀏覽器兼容性。