楊本輝
摘 要:利用PHP語(yǔ)言開(kāi)發(fā)的基于農(nóng)業(yè)的MVC設(shè)計(jì)模式的網(wǎng)絡(luò)蜘蛛??梢詫?shí)現(xiàn)采集,能夠把各類(lèi)的互聯(lián)網(wǎng)信息或者數(shù)據(jù)采集到自己的數(shù)據(jù)庫(kù)中,然后再進(jìn)行一系列的處理。本文介紹的是整個(gè)網(wǎng)絡(luò)蜘蛛從無(wú)到有的過(guò)程。利用MVC的架構(gòu)思想開(kāi)發(fā)出具有模塊化、易于多人開(kāi)發(fā)、易于維護(hù)性、易于拓展和易于二次開(kāi)發(fā)的特性的農(nóng)業(yè)網(wǎng)絡(luò)蜘蛛。
關(guān)鍵詞:PHP;MVC;農(nóng)業(yè)網(wǎng)絡(luò)蜘蛛
一、引言
農(nóng)業(yè)(Agriculture)是利用動(dòng)植物的生長(zhǎng)發(fā)育規(guī)律,通過(guò)人工培育來(lái)獲得產(chǎn)品的產(chǎn)業(yè)。農(nóng)業(yè)屬于第一產(chǎn)業(yè),研究農(nóng)業(yè)的科學(xué)是農(nóng)學(xué)。農(nóng)業(yè)的勞動(dòng)對(duì)象是有生命的動(dòng)植物,獲得的產(chǎn)品是動(dòng)植物本身。農(nóng)業(yè)提供支撐國(guó)民經(jīng)濟(jì)建設(shè)與發(fā)展的基礎(chǔ)產(chǎn)品。
傳統(tǒng)農(nóng)業(yè)發(fā)展到今天,生產(chǎn)力與生產(chǎn)資料已經(jīng)不能匹配時(shí)代的發(fā)展。特別作為人類(lèi)的精華,很多的農(nóng)業(yè)相關(guān)寶貴的知識(shí),不能夠很好地傳承與發(fā)展。而知識(shí)的傳承性,關(guān)系到人類(lèi)的興衰。如果知識(shí)不能很好的傳承,那么后世的人類(lèi)就必須重新去研究、探索、總結(jié)。無(wú)疑,農(nóng)業(yè)相關(guān)前人知識(shí)的研究不止要傳承下去,而且還要很好的傳承下去。
互聯(lián)網(wǎng)是一種現(xiàn)今先進(jìn)生產(chǎn)力的技術(shù)集,它集合了IT、網(wǎng)絡(luò)、大數(shù)據(jù)、人工智能等各種技術(shù)。它是人類(lèi)的先進(jìn)生產(chǎn)力與生產(chǎn)資料。農(nóng)業(yè)與互聯(lián)網(wǎng)的結(jié)合將對(duì)傳統(tǒng)農(nóng)業(yè)帶來(lái)全新的血液。結(jié)合互聯(lián)網(wǎng)的高速處理、持久存儲(chǔ)以及快速獲取的能力,互聯(lián)網(wǎng)將把農(nóng)業(yè)知識(shí)進(jìn)行極好的傳承,最終將會(huì)在講來(lái)把農(nóng)業(yè)推向一個(gè)新的高度。
二、網(wǎng)絡(luò)蜘蛛的定義與原理
網(wǎng)絡(luò)蜘蛛即Web Spider,是一個(gè)很形象的名字。如果把互聯(lián)網(wǎng)比喻成一個(gè)蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來(lái)爬去的蜘蛛。那么網(wǎng)絡(luò)蜘蛛到底是做什么的呢?
其實(shí)網(wǎng)絡(luò)蜘蛛就是一種獲取互聯(lián)網(wǎng)數(shù)據(jù)到特定數(shù)據(jù)庫(kù)系統(tǒng)中的一種程序工具,它的作用就是不斷的獲取互聯(lián)網(wǎng)的內(nèi)容,通過(guò)特有的過(guò)濾技術(shù),最終把內(nèi)容獲取到數(shù)據(jù)庫(kù)系統(tǒng)中,最終供用戶(hù)來(lái)檢索信息以及資源。
從架構(gòu)層面上來(lái)說(shuō):網(wǎng)絡(luò)蜘蛛是有很多種設(shè)計(jì)模式的,每種模式都有不同的應(yīng)用方向。常見(jiàn)的設(shè)計(jì)模式可以分為幾類(lèi)。
1. 深度優(yōu)先。深度優(yōu)先是指網(wǎng)絡(luò)蜘蛛會(huì)從 起始頁(yè)開(kāi)始,一個(gè)鏈接一個(gè)鏈接跟蹤下去,處理完這條線(xiàn)路之后再轉(zhuǎn)入下一個(gè)起始頁(yè),繼續(xù)跟蹤鏈接。這個(gè)方法有個(gè)優(yōu)點(diǎn)是網(wǎng)絡(luò)蜘蛛在設(shè)計(jì)的時(shí)候比較容易。
2. 廣度優(yōu)先。廣度優(yōu)先是指網(wǎng)絡(luò)蜘蛛會(huì)先抓取起始網(wǎng)頁(yè)中鏈接的所有網(wǎng)頁(yè),然后再選擇其中的一個(gè)鏈接網(wǎng)頁(yè),繼續(xù)抓取在此網(wǎng)頁(yè)中鏈接的所有網(wǎng)頁(yè)。這是最常用的方式,因?yàn)檫@個(gè)方法可以讓網(wǎng)絡(luò)蜘蛛并行處理,提高其抓取速度。
3.通用方式。網(wǎng)站內(nèi)容多種多樣,結(jié)構(gòu)也是各有不同,如何做到精準(zhǔn)抓取呢。這就需要一個(gè)通用的結(jié)構(gòu)體系。通用方式的結(jié)構(gòu)體系可以分為以下三個(gè)步驟:
(1) Url網(wǎng)址規(guī)則獲取
(2) Listing列表頁(yè)面獲取
(3) Content最終內(nèi)容頁(yè)面獲取
4.幾種方式的對(duì)比。無(wú)論是深度優(yōu)先,還是廣度優(yōu)先,在獲取內(nèi)容上通常是獲取一個(gè)超鏈接地址后一個(gè)一個(gè)的爬行,在有些我們不得不對(duì)特定的網(wǎng)站進(jìn)行內(nèi)容抓取的時(shí)候就沒(méi)有方法了。在這一種情況下,我們所需要的其實(shí)是精準(zhǔn)的抓取而不是一個(gè)接一個(gè)的“爬取”。所以深度優(yōu)先和廣度優(yōu)先在這一類(lèi)型的情況下是不適用的。通用方式就是解決這種情況的。通用方式會(huì)按照用戶(hù)需求有選擇的獲取內(nèi)容。
三、農(nóng)業(yè)網(wǎng)絡(luò)蜘蛛程序國(guó)內(nèi)外現(xiàn)狀
1.國(guó)外情況。國(guó)外的IT水平相對(duì)較高,我們可以在國(guó)外看到一些不錯(cuò)的網(wǎng)絡(luò)蜘蛛。
(1)Larbin。larbin是一種開(kāi)源的網(wǎng)絡(luò)爬蟲(chóng)/網(wǎng)絡(luò)蜘蛛,由法國(guó)的年輕人 Sébastien Ailleret獨(dú)立開(kāi)發(fā)。larbin目的是能夠跟蹤頁(yè)面的url進(jìn)行擴(kuò)展的抓取,最后為搜索引擎提供廣泛的數(shù)據(jù)來(lái)源 。
(2)Spiderman。Spiderman 是一個(gè)基于微內(nèi)核+插件式架構(gòu)的網(wǎng)絡(luò)蜘蛛,它的目標(biāo)是通過(guò)簡(jiǎn)單的方法就能將復(fù)雜的目標(biāo)網(wǎng)頁(yè)信息抓取并解析為自己所需要的業(yè)務(wù)數(shù)據(jù)。
(3)OpenWebSpider。OpenWebSpider是一個(gè)開(kāi)源多線(xiàn)程Web Spider(robot:機(jī)器人,crawler:爬蟲(chóng))和包含許多有趣功能的搜索引擎。
2.國(guó)內(nèi)情況。國(guó)內(nèi)的爬蟲(chóng)程序一般數(shù)量不多,質(zhì)量也不好,大多數(shù)程序是對(duì)于國(guó)外開(kāi)源程序的引用,以及二次開(kāi)發(fā),所以不做多講。
四、程序具體實(shí)現(xiàn)(程序設(shè)計(jì)簡(jiǎn)介)
1. 文件結(jié)構(gòu)。對(duì)于一個(gè)程序的實(shí)現(xiàn),文件結(jié)構(gòu)是十分重要的。良好的文件結(jié)構(gòu)常常意味著程序功能的合理。本程序的文件結(jié)構(gòu)圖如圖1所示:
圖1 文件結(jié)構(gòu)圖
Fig.1 The file structure diagram
2. 網(wǎng)絡(luò)蜘蛛的設(shè)計(jì)與流程。此農(nóng)業(yè)網(wǎng)絡(luò)蜘蛛是一個(gè)通用的采集程序,采用的是通用方式,基于MVC開(kāi)發(fā)思想,基于語(yǔ)言PHP,所需要的數(shù)據(jù)庫(kù)是開(kāi)源的輕量級(jí)數(shù)據(jù)庫(kù)sqlite,運(yùn)行的宿主操作系統(tǒng)是Linux。由于考慮到程序的通用性,所以每一個(gè)基礎(chǔ)的模塊是獨(dú)立封裝的,好比一個(gè)一個(gè)的零件。這樣的好處就是用戶(hù)可以根據(jù)自己的需求來(lái)組裝功能,這樣可以使得程序更加通用。程序的設(shè)計(jì)圖如圖2所示:
程序總共分為4個(gè)模塊,分別會(huì)在下一段說(shuō)明。
(1)用戶(hù)模塊。用戶(hù)模塊主要負(fù)責(zé)管理整個(gè)程序的登錄用戶(hù),比如用戶(hù)的增刪改查。還有密碼以及權(quán)限的配置。
(2) 配置模塊。配置模塊主要負(fù)責(zé)把用戶(hù)的一些設(shè)置信息存儲(chǔ)起來(lái)以方便供后續(xù)程序使用。
(3)采集模塊。采集模塊是整個(gè)網(wǎng)絡(luò)蜘蛛的核心模塊,整個(gè)蜘蛛的采集性能都是由這個(gè)模塊實(shí)現(xiàn)。其中這個(gè)模塊中有幾個(gè)核心問(wèn)題的處理方式如下:
① 采集重復(fù)怎么辦。采集重復(fù)在網(wǎng)絡(luò)爬蟲(chóng)中是普遍存在的。由于我們獲取源網(wǎng)站的數(shù)據(jù)的數(shù)據(jù)量都不小,而大多數(shù)時(shí)候我們?cè)诓杉痩isting列表的url的時(shí)候的時(shí)候,由于源網(wǎng)站的數(shù)據(jù)庫(kù)可能會(huì)有一些插入操作別人在同時(shí)進(jìn)行。所以這個(gè)時(shí)候取出的數(shù)據(jù)難免會(huì)和之前的數(shù)據(jù)想重復(fù),這個(gè)其實(shí)是一個(gè)很正常的問(wèn)題。
解決采集重復(fù)的方法需要我們利用數(shù)據(jù)庫(kù)的一些特性,把一些字段設(shè)置為unique,最終用replace into(sqlite的sql語(yǔ)句)進(jìn)行插入。
②采集出錯(cuò)、中斷怎么辦。采集過(guò)程中出錯(cuò)或者中斷是正常的,原因有很多,可是很多時(shí)候就只是僅僅由于網(wǎng)絡(luò)的不問(wèn)題,或者我們采集的源服務(wù)器不穩(wěn)定。而無(wú)論什么原因,這樣肯定會(huì)造成數(shù)據(jù)的丟失。而這個(gè)時(shí)候怎么辦呢。
解決方法實(shí)際上是在數(shù)據(jù)表里面添加一個(gè)字段專(zhuān)門(mén)來(lái)記錄數(shù)據(jù)寫(xiě)入是否成功。成功就為1不成功就為0。
(4)過(guò)濾模塊。由于各種原因,我們可能要對(duì)現(xiàn)有的一些采集數(shù)據(jù)進(jìn)行一些過(guò)濾,或者一些替換。在這種情況下,可能就要使用到過(guò)濾模塊,過(guò)濾模塊常常用于一些非法內(nèi)容的替換,或者一些無(wú)用內(nèi)容的過(guò)濾。
(5)發(fā)布模塊。等到數(shù)據(jù)從采集模塊獲取了以后,數(shù)據(jù)是存放在網(wǎng)絡(luò)蜘蛛的數(shù)據(jù)庫(kù)中。但是這樣的數(shù)據(jù)是無(wú)法直接導(dǎo)入到現(xiàn)有的一些主流的建站程序的。我們還必須要開(kāi)發(fā)一個(gè)中間件來(lái)適應(yīng)相應(yīng)的cms,從而達(dá)到可以把數(shù)據(jù)導(dǎo)入其他開(kāi)源程序的目的。
(6)插件模塊。由于程序的功能很多時(shí)候不可能一下子考慮的十分全面,并且在程序開(kāi)發(fā)中我們十分有必要使程序能夠拓展第三方的程序以使程序更加強(qiáng)大、健壯。所以特別多出一個(gè)插件模塊,主要負(fù)責(zé)整個(gè)程序新功能的拓展。而這個(gè)拓展一般由其他開(kāi)發(fā)人員按照本程序提供的接口實(shí)現(xiàn)。
(7)欄目模塊。由于采集的內(nèi)容種類(lèi)繁多,所以必須要有一個(gè)模塊來(lái)使程序采集來(lái)的數(shù)據(jù)按照要求進(jìn)行歸類(lèi),進(jìn)行管理。
(8) 內(nèi)容模塊。內(nèi)容模塊主要網(wǎng)絡(luò)蜘蛛負(fù)責(zé)采集來(lái)的內(nèi)容的增刪改查操作。這樣可以有效的管理采集來(lái)的資源。
五、本程序的優(yōu)勢(shì)
1.基于linux+nginx+PHP+sqlite??紤]到本程序的性能以及開(kāi)發(fā)的便利性,本程序采用的編程語(yǔ)言是目前最為流行的網(wǎng)絡(luò)編程語(yǔ)言PHP。
Sqlite是一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù),存儲(chǔ)效率高,數(shù)據(jù)以單文件的方式存儲(chǔ),節(jié)省系統(tǒng)資源占用,是一個(gè)十分優(yōu)秀的開(kāi)源輕量級(jí)數(shù)據(jù)庫(kù)。本程序的開(kāi)發(fā)所存儲(chǔ)的數(shù)據(jù)都將使用sqlite數(shù)據(jù)庫(kù)存儲(chǔ)。
2.基于MVC。MVC是一種思維規(guī)范,沒(méi)有明確的定義,只有一個(gè)需要遵循的思考方式,所以說(shuō),MVC是有不同的種類(lèi)的,因?yàn)檫@取決于某一種MVC框架作者的思想。一般來(lái)說(shuō)現(xiàn)在中國(guó)的互聯(lián)網(wǎng)流行的MVC實(shí)際上可以概括為:模型(Model),視圖(View)和控制Controller)。本程序的設(shè)計(jì)圍繞以下幾個(gè)方面作為思考:
(1) 各施其職,互不干涉。
(2) 有利于開(kāi)發(fā)中的分工。
(3) 有利于組件的重用。
六、存在的客觀問(wèn)題
面向?qū)ο蟮脑O(shè)計(jì)思想注定程序是比較龐大的,效率相比面向過(guò)程偏低。
對(duì)于一個(gè)程序來(lái)說(shuō),性能是很重要的。不過(guò)對(duì)于面向?qū)ο蟮某绦蛟O(shè)計(jì)都會(huì)有一個(gè)致命的弱點(diǎn)就是程序的性能不高。因?yàn)榱己玫耐卣剐砸约澳K化的MVC開(kāi)發(fā)思想多多少少都是會(huì)以損失一些程序性能為代價(jià)的。
七、結(jié)語(yǔ)
本網(wǎng)絡(luò)蜘蛛基于MVC的開(kāi)發(fā)思想,使用PHP開(kāi)發(fā)語(yǔ)言,能夠廣泛應(yīng)用于各個(gè)行業(yè)的信息以及資源獲取,從而用作分析或者其它目的。本網(wǎng)路蜘蛛從編寫(xiě)到成熟歷時(shí)3個(gè)月,中間大小修改大約50次。測(cè)試數(shù)據(jù)數(shù)目超過(guò)500萬(wàn)次。
參考文獻(xiàn):
[1] 開(kāi)源中國(guó). larbin. [EB/OL]. http://www.oschina.net/p/larbin. 2013-03-14.
[2] 開(kāi)源中國(guó).spiderman. [EB/OL]. http://www.oschina.net/p/spiderman.2013-3-14.
[3] 開(kāi)源中國(guó).openwebspider.[EB/OL].http://www.oschina.net/p/openwebspider. 2013-3-14.
[4] 開(kāi)源中國(guó).snoopy. [EB/OL].http://www.oschina.net/p/snoopy.2013-03-14.
[5] ChoJ,Garcia-MolinaH,PageL.Efficient crawling throughURL ordering. Proceedings of the7thACM-WWW InternationalConference . 1998.
[6] 郭海燕.搜索引擎中網(wǎng)絡(luò)爬蟲(chóng)技術(shù)研究[D]. 西安電子科技大學(xué) 2009.
[7] 李學(xué)勇,譚義紅,田立軍,歐陽(yáng)柳波,李國(guó)徽.ε-貪婪策略在網(wǎng)絡(luò)蜘蛛搜索策略中的應(yīng)用[J].湖南工程學(xué)院學(xué)報(bào)(自然科學(xué)版). 2004,(02).
[8] 李學(xué)勇,歐陽(yáng)柳波,李國(guó)徽.基于模擬退火機(jī)制的網(wǎng)絡(luò)蜘蛛搜索策略[J].湖南理工學(xué)院學(xué)報(bào)(自然科學(xué)版).2004,(02).
[9] 龍宇巍,王永成,許歡慶.定題搜索引擎Robot的設(shè)計(jì)與算法[J].計(jì)算機(jī)仿真.2004,(04).
[10] 華偉臣,張秀瓊.網(wǎng)絡(luò)蜘蛛搜索研究[J].樂(lè)山師范學(xué)院學(xué)報(bào). 2006,(05) .