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