葉長青 宋胡楊
摘要:隨著人類科技水平的不斷發(fā)展,計算機和網(wǎng)絡(luò)的使用也變得十分廣泛,同時隨著人們的需求日益增加,人們已經(jīng)開始意識到信息的重要性,而在當下這個網(wǎng)絡(luò)時代,數(shù)據(jù)信息大量進入互聯(lián)網(wǎng),信息的網(wǎng)絡(luò)化使得人們對于信息的收集和使用變得更加便捷,在這樣的背景下,誕生了網(wǎng)絡(luò)爬蟲技術(shù)。網(wǎng)絡(luò)爬蟲(web spider)是可以按照設(shè)定的規(guī)則對網(wǎng)絡(luò)信息進行抓取的程序或者腳本,是搜索引擎的重要組成部分。該文使用JAVA語言通過對網(wǎng)上的票務(wù)信息的抓取來獲取火車票以及機票的數(shù)據(jù),進而通過springMVC框架對數(shù)據(jù)展示與邏輯進行整合。使用此票務(wù)查詢系統(tǒng),可以實時查詢票務(wù)信息以及更加方便的對數(shù)據(jù)進行統(tǒng)計匯總。
關(guān)鍵詞: JAVA;網(wǎng)絡(luò)爬蟲;數(shù)據(jù)可視化
中圖分類號:TP311.5? ? ? ? 文獻標識碼:A? ? ? ? 文章編號:1009-3044(2018)36-0041-02
1 國內(nèi)外網(wǎng)絡(luò)爬蟲研究現(xiàn)狀
CNNIC一年兩次發(fā)布的《中國互聯(lián)網(wǎng)絡(luò)發(fā)展狀況統(tǒng)計報告》中進行了對中國互聯(lián)網(wǎng)絡(luò)發(fā)展狀況的全面反映和分析,以權(quán)威性被世人所知。在該報告中可以看出,一方面在信息時代,互聯(lián)網(wǎng)上面充斥著異常龐大的數(shù)據(jù)信息,另一方面,通過人工操作的方式在龐大的互聯(lián)網(wǎng)上想要找到自己需要的信息變得越來越困難。
自從2011年起,網(wǎng)絡(luò)爬蟲技術(shù)開始漸漸流行起來,逐步地被人們所重視,近幾年更是成為最炙手可熱的技術(shù)之一。爬蟲的開源框架也在不斷增加,使得爬蟲軟件的開發(fā)門檻變得越來越低,人們可以利用爬蟲來更加方便地獲取所需要的信息。
2 常用的網(wǎng)絡(luò)爬蟲技術(shù)與框架
搜索引擎是網(wǎng)絡(luò)爬蟲的一大重要應(yīng)用,主要用于輔助收集用戶互聯(lián)網(wǎng)上的信息。本文所使用的原理與搜索引擎的主要流程大致相似,只是通過縮小了數(shù)據(jù)的來源來簡化搜索引擎的過程,并且可以使得服務(wù)器負載要求得到降低,以實現(xiàn)可以在個人電腦中進行爬蟲程序的運行。
目前大部分網(wǎng)絡(luò)爬蟲的框架基本都是基于java或python語言的。如在python語言基礎(chǔ)上進行開發(fā)的scrapy框架、pyspider框架等,基于java的Nutch、WebMagic、HttpClient、SpiderMan、Crawler4j、WebController。基于框架的java爬蟲可以十分簡便的對網(wǎng)絡(luò)的數(shù)據(jù)進行爬取。為了對爬蟲底層原理進行更加深入的了解,本文不使用現(xiàn)有的爬蟲框架,二十使用原生java語言中的net包實現(xiàn)對網(wǎng)絡(luò)信息的抓取。
3 需求分析
3.1 可行性研究分析
票務(wù)查詢系統(tǒng)所需要的數(shù)據(jù)通過編寫網(wǎng)絡(luò)爬蟲程序來實現(xiàn)定向抓取,通過對數(shù)據(jù)的過濾、分析以及存儲來得到系統(tǒng)所需的數(shù)據(jù)。數(shù)據(jù)的可視化模塊通過jsp頁面進行展示,后臺服務(wù)器采用tomcat+SpringMVC的技術(shù),使用開源的MySQL進行數(shù)據(jù)的存儲,這些技術(shù)都是業(yè)界成熟多年的技術(shù),完全可以滿足本項目的要求。
通過對網(wǎng)絡(luò)上眾多的票務(wù)平臺進行的調(diào)查,可以發(fā)現(xiàn)票務(wù)查詢的請求以及返回的數(shù)據(jù)是具有一定規(guī)律的,發(fā)送的http消息頭的參數(shù)具有固定的名稱和種類,返回的http消息體也是具有固定結(jié)構(gòu)的json字符串,這便讓我們對票務(wù)數(shù)據(jù)的解析成為可能。
3.2 需求分析
3.2.1 在線查詢
此功能是本系統(tǒng)的主要功能,需要實現(xiàn)對查詢條件的設(shè)置與檢查、對票務(wù)數(shù)據(jù)的收集,并將數(shù)據(jù)傳輸至視圖頁面進行展示。由于在線查詢需要使用網(wǎng)絡(luò)帶寬,所以需要對此功能進行限制,用戶登錄后才可使用在線查詢系統(tǒng)。
3.2.2 離線查詢
此功能為使用本地查詢代替占用網(wǎng)絡(luò)進行的在線查詢,通過頁面收集查詢條件并通過本地數(shù)據(jù)庫對符合查詢條件的數(shù)據(jù)返回至頁面進行展示,作為在線的查詢功能的補充。本地數(shù)據(jù)庫的數(shù)據(jù)需要定時更新,通過設(shè)置定時器來完成該數(shù)據(jù)更新。
3.2.3 用戶注冊與登錄/注銷
需要用戶登錄才可使用在線查詢功能,在未登錄的情況下首先需要用戶注冊。系統(tǒng)應(yīng)記錄每一個用戶的個人信息。管理員使用單獨的模塊與登錄界面。
3.2.4 管理系統(tǒng)
管理員登錄后臺管理系統(tǒng)后,可對用戶賬戶信息進行管理,以及實現(xiàn)數(shù)據(jù)更新、制定和修改定時數(shù)據(jù)更新的計劃等。管理員通過專門的頁面進入后臺管理系統(tǒng)。
4 系統(tǒng)設(shè)計與實現(xiàn)
4.1 業(yè)務(wù)模塊與流程
本文使用MVC(Model/View/Controller)模式對票務(wù)系統(tǒng)進行構(gòu)建,首先,票務(wù)查詢系統(tǒng)的所需要的數(shù)據(jù)是通過爬蟲抓取,由于票務(wù)數(shù)據(jù)的實時性,所以對票務(wù)數(shù)據(jù)的更新不能間隔過久,但是由于數(shù)據(jù)量較大,也不能過于頻繁地對所有的票務(wù)數(shù)據(jù)進行更新,于是將用戶分為普通用戶和管理員用戶,將數(shù)據(jù)更新操作限定為只有管理員可以進行,以此來避免普通用戶誤操作引起的服務(wù)器占用過多的問題。
通過上述總結(jié)以及前面對需求的描述可得到結(jié)構(gòu)圖與流程圖如下(圖1)。根據(jù)此業(yè)務(wù)流程圖進行對系統(tǒng)各個模塊的設(shè)計與開發(fā)。
4.2 數(shù)據(jù)庫設(shè)計
在本系統(tǒng)中,涉及的數(shù)據(jù)面總共分為三個部分:用戶、車站、車票,系統(tǒng)數(shù)據(jù)庫ER圖構(gòu)成如下圖(圖2)
5 系統(tǒng)實現(xiàn)
系統(tǒng)遵循MVC模式設(shè)計,系統(tǒng)的文件結(jié)構(gòu)如下:Annotation為聲明用于忽略dao層的注解,constants存儲一些程序內(nèi)部使用的固定值便于修改,ctrl、dao、model、service為MVC模式的各個模塊,spider內(nèi)含有用于獲取數(shù)據(jù)的爬蟲,utils為一些程序中會用到的工具類的整合。
5.1 用戶模塊
通過數(shù)據(jù)庫設(shè)計對應(yīng)用戶的類user來存放用戶數(shù)據(jù)。并依據(jù)Spring框架分別創(chuàng)建MainController、MainService、MainDao作為用戶登錄控制器。MainMapper作為用戶數(shù)據(jù)庫sql操作管理xml。前端頁面通過AngularJS綁定獲取輸入框數(shù)據(jù)并通過jQuery.post向服務(wù)器發(fā)起請求,請求鏈接頭部為${pageContext.request.contextPath }獲取服務(wù)器頭部地址,尾部通過注解@RequestMapping在MainController設(shè)置,并將username與userpwd傳入MainController,調(diào)用MainService驗證登錄,通過調(diào)用MainDao接口來調(diào)取對應(yīng)MainMapper中的方法查詢數(shù)據(jù)庫中的用戶信息并將信息存入user類。如果登錄成功則檢查用戶權(quán)限是否為管理員,如果是,直接轉(zhuǎn)發(fā)至管理員頁面,如果不是則將登錄用戶id存入session并進入查詢頁面。
5.2 數(shù)據(jù)獲取模塊
數(shù)據(jù)獲取模塊為本系統(tǒng)的核心模塊,通過發(fā)送http請求來實現(xiàn)獲取本系統(tǒng)所需要的數(shù)據(jù),通過分析對方返回的數(shù)據(jù)格式的分析,例如:“@bjb|北京北|VAP|beijingbei|bjb|0@bjd|北京東|BOP|beijingdong|bjd|1@”,發(fā)現(xiàn),數(shù)據(jù)之間以“@”進行分割,通過服務(wù)器端獲取數(shù)據(jù)并將數(shù)據(jù)進行分割存儲可以得到車站的信息。通過管理員頁面的導(dǎo)入操作向AdminController中insertStation()中@RequestMapping設(shè)置的地址發(fā)起請求,執(zhí)行AdminService中insertStation()函數(shù),在AdminService中調(diào)用TrainSpider中g(shù)etStationData()來獲取車站列表并將車站表通過調(diào)用AdminDao接口映射的AdminMapper中的對應(yīng)方法存入數(shù)據(jù)庫中。此操作只需在系統(tǒng)部署時進行一次即可。
有了車站的信息便可以進行對獲取車票程序的編寫,首先先對車票查詢的請求url進行分析,可以得出http消息體的結(jié)構(gòu),向此url發(fā)送請求便可以獲得查詢的車票的全部信息,再通過對信息的分析和拆分便可以將信息存入對應(yīng)的java類再在程序中進行操作便構(gòu)成了車票的爬蟲。通過管理員頁面的導(dǎo)入車票信息來導(dǎo)入從今日起未來七日的車票信息。此操作向AdminController中insertTrain()中@RequestMapping設(shè)置的地址發(fā)起請求,執(zhí)行AdminService中insertTrain()函數(shù),在此函數(shù)中AdminService會首先通過調(diào)用TrainSpider中g(shù)etStationData()來獲取車站列表,根據(jù)車站列表遍歷獲取需要查詢的所有車票查詢條件并調(diào)用TrainSpider中g(shù)etTrainData()獲取車票信息表并通過調(diào)用AdminDao接口映射的AdminMapper中的對應(yīng)方法存入數(shù)據(jù)庫中。為保證數(shù)據(jù)唯一性,導(dǎo)入前會刪除掉數(shù)據(jù)庫中現(xiàn)有車票數(shù)據(jù)。
查詢時通過對session中是否存有用戶id判斷是否登錄,如有登錄則進行在線查詢,沒有登錄則進行離線查詢。在線查詢直接使用TrainSpider中g(shù)etTrainData()獲取車票信息。離線查詢則調(diào)用SearchController到SearchService到SearchDao中獲取數(shù)據(jù)庫中對應(yīng)查詢條件的數(shù)據(jù)。查詢需要使用數(shù)據(jù)庫中對應(yīng)的車站信息,所以還需要從SearchDao中獲取車站信息來進行輔助。
6 小結(jié)
在互聯(lián)網(wǎng)的飛速發(fā)展下,數(shù)據(jù)在生活之中所扮演的角色也變得十分重要,爬蟲系統(tǒng)也逐漸成為數(shù)據(jù)獲取的主要方式,通過本文所實現(xiàn)的票務(wù)查詢系統(tǒng)可以對爬蟲系統(tǒng)進行一個初步的了解。
本文主要介紹了利用java爬蟲技術(shù)的票務(wù)查詢系統(tǒng)的開發(fā),從需求分析、相關(guān)技術(shù)分析、框架搭建、具體設(shè)計等幾個方面進行了介紹,并且對使用的技術(shù)進行了詳細的分析與解釋。本次開發(fā)有以下幾個技術(shù)要點:1) 對請求的分析較為復(fù)雜,本系統(tǒng)中使用的不僅是簡單的http操作,在查詢時使用的車站代碼也需要通過爬蟲獲取,獲取后才得到車站中文對應(yīng)名稱。
2) 對獲取的數(shù)據(jù)解析較為復(fù)雜,系統(tǒng)通過請求獲取到的票務(wù)數(shù)據(jù)為按照某種格式存儲的數(shù)據(jù),需要對數(shù)據(jù)進行多次不同條件與結(jié)果的查詢來對數(shù)據(jù)格式進行分析,數(shù)據(jù)量較大所以數(shù)據(jù)格式分析工作量較大。
3) 對于網(wǎng)絡(luò)錯誤返回碼對應(yīng)頁面的響應(yīng),由于爬蟲系統(tǒng)需要使用互聯(lián)網(wǎng),難免遇到網(wǎng)絡(luò)堵塞等問題,需要針對網(wǎng)絡(luò)可能發(fā)生的多種問題進行分析并編寫對應(yīng)的響應(yīng)。
本次開發(fā)的票務(wù)查詢系統(tǒng)仍然存在著些許不足之處,比如在多用戶高并發(fā)的情況下的快速響應(yīng)方面還需要做進一步的優(yōu)化,但在用戶量不是特別大的情況下,已經(jīng)可以實現(xiàn)對票務(wù)信息的在線和離線查詢,業(yè)務(wù)的框架已經(jīng)建立起來了,可以作為此類問題的一個解決方案。
參考文獻:
[1] 劉晶晶. 面向微博的網(wǎng)絡(luò)爬蟲研究與實現(xiàn)[D]. 上海: 復(fù)旦大學(xué), 2012.
[2] 中國互聯(lián)網(wǎng)絡(luò)信息中心. 第32次中國互聯(lián)網(wǎng)絡(luò)發(fā)展狀況統(tǒng)計報告[J]. 互聯(lián)網(wǎng)天地, 2013(10):74-91.
[3] 鄭豪, 何彥雨. 基于Java平臺的分布式網(wǎng)絡(luò)爬蟲系統(tǒng)研究[J]. 北京. 科技創(chuàng)新與應(yīng)用, 2017(1):112-112.
[4] 李博文. 基于Java的搜索引擎的設(shè)計與實現(xiàn)[D]. 長春: 吉林大學(xué), 2016.
[5] 楊青松. 爬蟲技術(shù)在互聯(lián)網(wǎng)領(lǐng)域的應(yīng)用探索[J]. 電腦知識與技術(shù), 2016, 12(15):62-64.
[6] 羅剛. 自己動手寫網(wǎng)絡(luò)爬蟲[M]. 北京: 清華大學(xué)出版社, 2016.
[7] 馬原, 沈煒, 賈宇波. AngularJS框架的搜索引擎優(yōu)化策略與實現(xiàn)[J]. 工業(yè)控制計算機, 2017, 30(4):113-114.
[8] 吳向陽, 陳萬烤, 張禎,等. 面向訂票服務(wù)器端爬蟲的可視檢測方法研究[J]. 計算機輔助設(shè)計與圖形學(xué)學(xué)報, 2018(1).
[9] 鄭豪, 何彥雨. 基于Java平臺的分布式網(wǎng)絡(luò)爬蟲系統(tǒng)研究[J]. 科技創(chuàng)新與應(yīng)用, 2017(1):112-112.
[10] 董博, 李翀, 劉學(xué)敏,等. 基于爬蟲的數(shù)據(jù)監(jiān)控系統(tǒng)[J]. 計算機系統(tǒng)應(yīng)用, 2017, 26(10):53-60.
[11] 朱莉娜, 李澤平. 網(wǎng)絡(luò)爬蟲技術(shù)的研究與實現(xiàn)[J]. 科學(xué)技術(shù)創(chuàng)新, 2017(10):166-166.
[通聯(lián)編輯:代影]