施 鷺
(蕪湖職業(yè)技術(shù)學(xué)院,蕪湖 241000)
近年來,博客系統(tǒng)作為一種經(jīng)典的網(wǎng)絡(luò)應(yīng)用模型,成為人們工作、家庭、社交領(lǐng)域中使用的交流工具,它改進(jìn)了人們之間的溝通方式。本文研發(fā)的博客系統(tǒng),選取大數(shù)據(jù)生態(tài)技術(shù)手段,設(shè)計(jì)實(shí)現(xiàn)博客系統(tǒng)中主要的功能,并運(yùn)用爬蟲技術(shù),獲取互聯(lián)網(wǎng)上“有價(jià)值”的數(shù)據(jù),推送到博客系統(tǒng)中。
博客在國內(nèi)從2000 年開始引入其概念,最顯著的就是各大門戶網(wǎng)站都構(gòu)建了博客系統(tǒng),人們通過博客系統(tǒng)發(fā)表自己的文章、評(píng)論,分享日常生活中的經(jīng)驗(yàn)。博客不僅打破了傳統(tǒng)門戶網(wǎng)站話語權(quán)的權(quán)威性和獨(dú)斷性,而且使每個(gè)人的“個(gè)性化意見”可以快速、廣泛地傳播。
本文提出研發(fā)的基于大數(shù)據(jù)技術(shù)的博客系統(tǒng),希望采用典型的軟件開發(fā)技術(shù),構(gòu)建簡潔、易用的博客系統(tǒng),特點(diǎn)是加入爬蟲技術(shù)手段,主動(dòng)獲取門戶網(wǎng)站的每日熱點(diǎn)新聞,推送到博客系統(tǒng)中,并選用分布式索引技術(shù)手段,實(shí)現(xiàn)博文數(shù)據(jù)的檢索,提高系統(tǒng)的運(yùn)行性能。
系統(tǒng)使用Java Web 作為技術(shù)實(shí)現(xiàn)手段,將整個(gè)博客系統(tǒng)業(yè)務(wù)分為用戶接口層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層,即Servlet+Service+JSP,其中Servlet 負(fù)責(zé)接收用戶端的各種業(yè)務(wù)請求,Service 層具體實(shí)現(xiàn)系統(tǒng)模塊的功能,JSP 頁面負(fù)責(zé)將用戶請求的處理結(jié)果呈現(xiàn)給客戶端。
數(shù)據(jù)爬蟲模塊,選用HttpClient 和HtmlCleaner組件,將爬取的數(shù)據(jù)經(jīng)過加工處理后推送到數(shù)據(jù)庫中。全文檢索是博客系統(tǒng)中的一個(gè)核心業(yè)務(wù)功能,我們選擇Solr 技術(shù)來構(gòu)建索引服務(wù)器,博客數(shù)據(jù)經(jīng)過中文分詞模塊處理后,在Solr 索引庫中建立索引數(shù)據(jù),實(shí)現(xiàn)全文檢索功能。爬蟲解析模塊,將獲取到的新浪、網(wǎng)易、鳳凰網(wǎng)站的數(shù)據(jù),轉(zhuǎn)換成博文數(shù)據(jù)并推送給用戶。
博客系統(tǒng)的用戶角色分為普通用戶和管理員。對于管理員,系統(tǒng)提供統(tǒng)一的后臺(tái)登錄入口,管理員從后臺(tái)登錄后,可以對普通用戶進(jìn)行賬號(hào)管理,包括停用或恢復(fù)賬號(hào)、重置用戶密碼,可以查看或封停系統(tǒng)中的博文數(shù)據(jù),查看或封停博文的用戶評(píng)論數(shù)據(jù)。管理員可以對系統(tǒng)中的爬蟲模塊向用戶推送博文的功能進(jìn)行配置。
普通用戶可細(xì)分為注冊用戶和游客,游客訪問本系統(tǒng)受到限制,僅允許瀏覽文章。注冊用戶需要先完成用戶注冊,考慮系統(tǒng)的開放性,用戶無須實(shí)名注冊,但在用戶注冊時(shí),需要提供唯一的手機(jī)號(hào)碼,并完成短信驗(yàn)證。注冊用戶完成后,可以發(fā)布博文,編輯和修改博文。用戶注冊查看博文,可以點(diǎn)贊、評(píng)論、收藏或轉(zhuǎn)發(fā)。注冊用戶可以在首頁輸入關(guān)鍵字,全文檢索出包含該關(guān)鍵字的博文,同樣可以在個(gè)人中心設(shè)置基本資料。
系統(tǒng)選取MySQL 作為業(yè)務(wù)數(shù)據(jù)庫,運(yùn)用PowerDesign 工具進(jìn)行數(shù)據(jù)建模,分析數(shù)據(jù)模型之間的關(guān)系,最后生成SQL 腳本文件執(zhí)行,得到所需全部數(shù)據(jù)表。用戶表t_user 使用status 字段來表示用戶狀態(tài)(身份),值為0 表示管理員,值為1 表示注冊用戶,值為2 表示用戶為禁用狀態(tài)。用戶表t_user 的基本字段有用戶名稱、頭像地址、電子郵箱、登錄密碼、狀態(tài)、手機(jī)號(hào)。博客表t_blog 記錄注冊用戶發(fā)表的博客文章數(shù)據(jù),該表的基本字段有類型名稱、內(nèi)容、圖片地址、狀態(tài)、用戶ID、博文標(biāo)簽等。
除此之外,還有評(píng)論表t_commit,記錄用戶發(fā)表的評(píng)論數(shù)據(jù),統(tǒng)計(jì)表t_statistical,記錄博文的用戶點(diǎn)贊、收藏?cái)?shù)據(jù)。上述的幾張表是系統(tǒng)的業(yè)務(wù)數(shù)據(jù)表,我們還需要給每張表建立對應(yīng)的Java 實(shí)體類型,依次是為User 類、BlogType 類、Blog 類、Commit 類、Statistical 類,把這些類定義在系統(tǒng)的com.whit.blog.domain 包下。索引文檔模型Article 是專門用來封裝需要進(jìn)行索引存儲(chǔ)的數(shù)據(jù)模型,字段包含索引主鍵字段、博客文章標(biāo)題、文章作者、發(fā)布日期時(shí)間、正文內(nèi)容。
本系統(tǒng)選取Java 8.0 作為開發(fā)語言,采用STS(Spring Tool Suite)作為編程工具,開發(fā)階段選擇使用VMwareWorkStation 虛擬機(jī)運(yùn)行Solr 索引服務(wù)器。我們需要對Solr 索引服務(wù)器進(jìn)行安裝和必要的配置。首先在虛擬機(jī)平臺(tái)中,將準(zhǔn)備好的solr-4.10.4.tgz 安裝包文件解壓縮,并將IK 分詞器IKAnalyzer2012FF_u1.jar 文件導(dǎo)入Solr 的安裝目錄位置下的solr-web 中的lib 目錄,然后我們在IK分詞器的配置文件schema.xml 中添加必要的參數(shù)信息,在該文件的properties 標(biāo)簽內(nèi),定義兩組entry標(biāo)簽,內(nèi)容分別是擴(kuò)展字典文件名稱和禁用詞文件名稱,最后我們將這兩個(gè)文件和和配置文件schema.xml 一同放置在solr-web 中的類路徑下。完成了IK 分詞器組件的配置后,我們將Solr 索引服務(wù)器處理的字段和其字段的數(shù)據(jù)類型預(yù)先進(jìn)行定義,部分代碼如下所示。
這里定義了copyField 類型字段title_author_content,該字段的作用是當(dāng)博客數(shù)據(jù)存儲(chǔ)到Solr 索引庫中后,博客的標(biāo)題、作者、內(nèi)容字段會(huì)復(fù)制一份到title_author_content 字段中,這樣博客系統(tǒng)可以通過該字段來進(jìn)行統(tǒng)一的索引查詢。上述配置中,字段類型type 值均設(shè)置為text_ik,該字段類型對應(yīng)的IK 分詞器代碼配置如下所示。
1.博客發(fā)表模塊
博客發(fā)表模塊提供給注冊用戶發(fā)表新博文,用戶發(fā)表時(shí),需要選擇博文的類型,填寫博文的標(biāo)題,選擇或新增標(biāo)簽,撰寫博文的內(nèi)容,也可以上傳圖片。系統(tǒng)允許博文的作者在查看自己發(fā)布的博文時(shí),直接編輯或刪除該博文,刪除時(shí),博文關(guān)聯(lián)的評(píng)論、點(diǎn)贊等數(shù)據(jù)也會(huì)被一并刪除。
2.全文檢索模塊
系統(tǒng)首頁提供輸入框,用戶輸入搜索關(guān)鍵字進(jìn)行數(shù)據(jù)全文檢索,將搜索的結(jié)果分頁顯示出來,用戶點(diǎn)擊某個(gè)博客鏈接后,查看到該博客的完整內(nèi)容。
用戶發(fā)表博文,系統(tǒng)將新數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫中,同時(shí)將博文的標(biāo)題、作者、正文數(shù)據(jù),存儲(chǔ)到Solr 索引服務(wù)器中,建立索引文檔。首先定義SolrUtil 工具類,該類中定義Solor 索引服務(wù)器連接地址、端口號(hào)等參數(shù),初始化HttpSolrServer 實(shí)例,該實(shí)例提供訪問索引服務(wù)器的方法。接著實(shí)現(xiàn)建立索引文檔、刪除索引文檔、查詢索引文檔方法。在系統(tǒng)存儲(chǔ)博客文章時(shí),調(diào)用addBean 方法,將封裝好的Article 對象傳入,Solor 會(huì)根據(jù)Article 對象的每個(gè)屬性名,建立字段值與該屬性的值對應(yīng)的索引文檔對象,并提交給Solr 索引服務(wù)器存儲(chǔ)。在全文檢索時(shí),系統(tǒng)調(diào)用SolrUtil 提供的search 方法,將輸入的查詢關(guān)鍵字傳入,搜索引擎根據(jù)之前配置的title_author_content 字段,執(zhí)行字符串模糊匹配規(guī)則的檢索,并將檢索結(jié)果以Json 的數(shù)據(jù)格式返回給檢索頁面。
3.評(píng)論、收藏和點(diǎn)贊模塊
該模塊主要提供給注冊用戶多種互動(dòng)交流功能,用戶在閱讀他人的博文后,可以輸入評(píng)論文字,點(diǎn)擊發(fā)表按鈕發(fā)布評(píng)論,或者點(diǎn)擊點(diǎn)贊按鈕給該博文點(diǎn)贊數(shù)加一。點(diǎn)擊博文下方的收藏按鈕,將該博文加到自己的收藏列表。需要說明的是,評(píng)論發(fā)出后不可以修改評(píng)論數(shù)據(jù),這是為了提高評(píng)論數(shù)據(jù)的時(shí)效性。在博文的下方,評(píng)論、收藏、點(diǎn)贊按鈕上,會(huì)顯示出博文的評(píng)論、收藏、點(diǎn)贊的統(tǒng)計(jì)數(shù)字,方便直觀看出該博文的受歡迎程度。
4.數(shù)據(jù)爬取模塊
數(shù)據(jù)爬取模塊,選取幾個(gè)門戶網(wǎng)站的每日頭條新聞或熱點(diǎn)博客文章,經(jīng)過系統(tǒng)一系列處理后推送到博客系統(tǒng)中。具體做法是,管理員在系統(tǒng)管理后臺(tái)配置爬取數(shù)據(jù)目標(biāo)網(wǎng)站地址、爬取任務(wù)開始時(shí)間和推送博文目標(biāo)用戶。數(shù)據(jù)爬取引擎開始工作時(shí),先爬取目標(biāo)網(wǎng)站的起始頁面,再根據(jù)該頁面的分頁規(guī)則,依次獲取所有數(shù)據(jù)列表頁面,然后在這些數(shù)據(jù)列表頁面中,解析出新聞或博客文章鏈接的原始URL 地址,并把這些地址緩存到URL 解析地址隊(duì)列中。接著,數(shù)據(jù)解析引擎將依次從URL 解析地址隊(duì)列中取出URL 地址,下載頁面的內(nèi)容并解析數(shù)據(jù),將數(shù)據(jù)封裝成由標(biāo)題、作者、發(fā)布日期時(shí)間、內(nèi)容組成的JSON 格式的博客數(shù)據(jù),最后將解析完成的數(shù)據(jù)發(fā)送到MySQL 數(shù)據(jù)庫存儲(chǔ)并建立該數(shù)據(jù)的Solr 索引文檔。
系統(tǒng)爬取外部網(wǎng)站中的數(shù)據(jù)并解析數(shù)據(jù)內(nèi)容時(shí),使用HttpClient+HtmlCleaner 的技術(shù)組合,基于Xpath 技術(shù)獲取到網(wǎng)頁內(nèi)容中需要的元素。網(wǎng)站的網(wǎng)頁結(jié)構(gòu)可能會(huì)有變化,因此數(shù)據(jù)爬取模塊,在每日啟動(dòng)爬取任務(wù)前,先檢測待爬取網(wǎng)站,測試是否可獲取到數(shù)據(jù),如有異常則停止爬取任務(wù)并向管理員報(bào)告,更改目標(biāo)網(wǎng)站的爬取規(guī)則并通過更新jar 包文件的形式更新爬取模塊,具有較好的兼容性和可維護(hù)性。
系統(tǒng)后續(xù)的工作,一是考慮用戶數(shù)和文章數(shù)據(jù)量不斷增加后,對數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的升級(jí)改造,搭建分布式的Solor 集群。二是考慮數(shù)據(jù)爬取形成的博文推送給系統(tǒng)用戶的方式,可構(gòu)建用戶畫像并增加推薦機(jī)制,向系統(tǒng)用戶推薦更符合自身需求的博客數(shù)據(jù),提升用戶體驗(yàn)。