閔磊
摘? 要:在信息化的時(shí)代背景下,對電子文獻(xiàn)資源庫的可用性進(jìn)行監(jiān)測,是科研及教學(xué)的一項(xiàng)重要保障。該文對基于網(wǎng)絡(luò)爬蟲機(jī)制的文獻(xiàn)資源監(jiān)測技術(shù)進(jìn)行了研究,重點(diǎn)探討了技術(shù)選型、HTML文檔抓取以及DOM樹解析等內(nèi)容,并對文獻(xiàn)資源特征和系統(tǒng)架構(gòu)展開了分析。該技術(shù)以Web服務(wù)器訪問端口為數(shù)據(jù)輸入源,因而具有較強(qiáng)的平臺無關(guān)性,能適應(yīng)網(wǎng)絡(luò)多樣化的特點(diǎn)。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲? 電子資源? 可用性監(jiān)測? HTML解析
中圖分類號:G647? ? ? ? ? ? ? ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識碼:A? ? ? ? ? ? ? ? ? ?文章編號:1672-3791(2020)09(c)-0005-03
Abstract: In the era of information technology, availability monitoring of electronic literature resources is important for scientific research and teaching. In this paper, we study the monitoring technology based on web crawler mechanism. We focus on technology selection, HTML document capturing, DOM parsing and analyzing the system architecture. This technology takes web services as data source, so it has strong platform independence and is adaptable for complex networks.
Key Words: Web crawler; Literature resources; Availability monitoring; HTML parser
文獻(xiàn)是開展科研及教學(xué)活動的重要資源,是傳播知識的關(guān)鍵載體。在信息技術(shù)高速發(fā)展的背景下,文獻(xiàn)資源的電子化已成為一種必然的趨勢。為了向廣大科研人員和師生提供豐富的學(xué)術(shù)資源,各高校以及科研機(jī)構(gòu)目前都在積極引進(jìn)各類電子文獻(xiàn)資源數(shù)據(jù)庫。
為了保障電子文獻(xiàn)資源的正常訪問,管理人員需要對其進(jìn)行定期監(jiān)測。目前,常用的監(jiān)測手段有手動訪問、利用程序?qū)Ψ?wù)器的連通性進(jìn)行掃描的方式等。手動訪問方式雖然準(zhǔn)確但較為耗時(shí),隨著文獻(xiàn)資源數(shù)據(jù)庫數(shù)量的增多,這種人工監(jiān)測的手段必將逐漸被淘汰。而通過程序掃描服務(wù)器連通性的方式,盡管具有較高效率,但它僅僅只能探測到資源庫前端服務(wù)器的連通性,對后臺資源的可用性和訪問權(quán)限不能很好地檢測。
針對當(dāng)前電子文獻(xiàn)資源可用性監(jiān)測技術(shù)的不足,該文研究了基于網(wǎng)絡(luò)爬蟲機(jī)制的資源監(jiān)測方法。該方法對電子文獻(xiàn)資源庫的可訪問性、可下載性及訪問權(quán)限的可用性等能進(jìn)行高效檢測。并且由于采用了爬蟲機(jī)制,該方法還對資源服務(wù)器的平臺和數(shù)據(jù)庫類型不敏感,具有較強(qiáng)的通用性。
1? 需求特點(diǎn)及技術(shù)選型
1.1 文獻(xiàn)資源平臺的多樣性
開放性是學(xué)術(shù)交流的一個典型特征,文獻(xiàn)資源庫作為學(xué)術(shù)資源的載體同樣也具有明顯的開放性。在這種開放的環(huán)境下,各資源供應(yīng)商就可能采用不同的技術(shù)來架構(gòu)資源服務(wù)平臺。例如,在操作系統(tǒng)方面可采用Linux、Unix、Window等,在數(shù)據(jù)庫方面可采用MySQL、MSSQL Serve、Oracle等,前端Web服務(wù)器可采用IIS、Tomcat、Nginx等。面對多樣化的架構(gòu)和技術(shù),很難找到一種各平臺均兼容的方式對其可用性進(jìn)行檢測。
1.2 訪問故障的復(fù)雜性
從用戶到文獻(xiàn)資源的服務(wù)器端,中間需要經(jīng)過用戶主機(jī)、用戶本地網(wǎng)絡(luò)、互聯(lián)網(wǎng)、資源服務(wù)器等諸多環(huán)節(jié)。在用戶使用過程中,其中任何一處出現(xiàn)異常都可能造成電子資源訪問的失敗。對于管理員而言,不管這種故障發(fā)生在何處,都需要向用戶提供技術(shù)支持。而這種故障的復(fù)雜性,使其管理工作變得極為繁瑣。
1.3 技術(shù)選型
平臺的多樣性和訪問故障的復(fù)雜性,是電子文獻(xiàn)資源的固有特性,在對資源的可用性進(jìn)行監(jiān)測時(shí)必須對此加以考慮。對于B/S結(jié)構(gòu)的資源服務(wù),不管服務(wù)器端采用何種技術(shù)或何種平臺,最終在用戶層面都體現(xiàn)為能夠訪問的網(wǎng)頁或下載的文件,而瀏覽器可以對此進(jìn)行統(tǒng)一的處理。如果能對瀏覽器的行為進(jìn)行模擬,那么就可以通過程序的手段按一致的方式對資源可用性進(jìn)行監(jiān)測。
目前模擬瀏覽器的方式有兩類:一類是對瀏覽器控件進(jìn)行調(diào)用,在操作層面模擬;另一類是通過網(wǎng)絡(luò)爬蟲的方式,在數(shù)據(jù)包層面進(jìn)行模擬??紤]到不同資源平臺對于瀏覽器控件兼容性的問題,該文采用網(wǎng)絡(luò)爬蟲的方式模擬瀏覽器進(jìn)行監(jiān)測。
此外,為了更為方便地對訪問故障進(jìn)行定位,監(jiān)測程序的部署位置也較為重要。如果將其部署在本地普通客戶端,那么僅能檢測出是否發(fā)生了故障,而無法對故障的大致位置進(jìn)行判斷。因此,監(jiān)測程序理想的部署位置應(yīng)處于內(nèi)外網(wǎng)絡(luò)的交界處,此處的節(jié)點(diǎn)將網(wǎng)絡(luò)路徑分割為兩段。如果用戶對資源訪問失敗,但檢測程序訪問成功,那么就明顯能排除外網(wǎng)和資源服務(wù)器的故障;而如果兩者均訪問失敗,就需要考慮是否為外網(wǎng)或者資源服務(wù)器的問題了。
2? 系統(tǒng)架構(gòu)
在利用網(wǎng)絡(luò)爬蟲對電子文獻(xiàn)資源進(jìn)行監(jiān)測時(shí),資源若被判斷為可用,則必須具備兩個條件:第一,爬蟲程序要能與服務(wù)器取得鏈接;第二,爬蟲程序從服務(wù)器抓取的數(shù)據(jù)需要符合正確的模式。這種模式既要滿足Web文檔的有效形式,也必須滿足應(yīng)用層面的權(quán)限要求,如IP訪問許可等。此外,對于檢測出的異常結(jié)果和一些常規(guī)的操作,也需要設(shè)計(jì)相應(yīng)的功能。因此,系統(tǒng)從邏輯上可以分為3個層次:資源獲取層、數(shù)據(jù)分析層和功能表現(xiàn)層,如圖1所示。
(1)資源獲取層。與服務(wù)器建立鏈接,分析URL地址,以及通過HTTP的Response來獲取Web服務(wù)返回的HTML及二進(jìn)制數(shù)據(jù)。若未能與服務(wù)器成功建立鏈接,則直接判斷訪問失敗。若服務(wù)器的HTTP返回碼為404或405等未成功代碼,也判斷訪問失敗。需要注意的是,對于資源訪問權(quán)限的檢測既可能直接通過403返回碼來表示,也可能通過正常的頁面提示來表示。如果是前者,則在該層中判斷對資源無訪問權(quán)限,反之則需要在數(shù)據(jù)分析層通過HTML解析判斷。
(2)數(shù)據(jù)分析層。進(jìn)行HTML解析,判斷返回的文檔是否與正常權(quán)限下的預(yù)期文檔一致,或者進(jìn)行二進(jìn)制分析,對下載的文件與預(yù)存檔文件進(jìn)行二進(jìn)制對比。如果從資源獲取層得到的數(shù)據(jù)是HTML文檔,則將其轉(zhuǎn)換為DOM樹后進(jìn)行內(nèi)容分析,此時(shí)采用XPath抓取一段特征碼進(jìn)行文本對比。如果得到的是PDF、DOC等文件,則與預(yù)先存檔的文件進(jìn)行二進(jìn)制對比。
(3)功能表現(xiàn)層。將資源獲取層和數(shù)據(jù)分析層判斷的異常結(jié)果進(jìn)行匯總,并通過報(bào)警窗口或電子郵件的方式進(jìn)行異常報(bào)警。此外,此層中還包含參數(shù)設(shè)置、功能操作等常用功能。
3? 關(guān)鍵技術(shù)分析
該文所述功能采用C#語言編碼實(shí)現(xiàn),使用HtmlAgilityPack庫進(jìn)行HTML解析。此外在利用爬蟲功能抓取數(shù)據(jù)時(shí),為提高效率并避免程序假死,使用了多線程技術(shù)。該系統(tǒng)所涉及的主要技術(shù)如下。
3.1 基于HTTP的爬蟲技術(shù)
在進(jìn)行數(shù)據(jù)抓取時(shí),采用System.Net.HttpWebRequest類的靜態(tài)Create方法來創(chuàng)建HttpWebRequest對象,創(chuàng)建該對象時(shí)傳入U(xiǎn)RL地址作為參數(shù)。然后通過該對象的GetResponse方法從遠(yuǎn)端服務(wù)器中得到傳回的數(shù)據(jù),該數(shù)據(jù)包含于HttpWebResponse對象中。
對于HttpWebRequest對象,需要傳入相應(yīng)的參數(shù)。包括模仿瀏覽器配置的UserAgent、設(shè)置數(shù)據(jù)請求方式的Method、設(shè)置超時(shí)時(shí)長的Timeout、是否允許自動重定向的AllowAutoRedirect等。
如果需要對服務(wù)器提交表格數(shù)據(jù),則Method屬性需要設(shè)置為Post。此時(shí)通過HttpWebRequest.GetRequestStream()創(chuàng)建一個數(shù)據(jù)流,并將數(shù)據(jù)流形式的Post參數(shù)寫入該流。對于其他僅是請求返回?cái)?shù)據(jù)的情況,則設(shè)置Method參數(shù)為Get。
需要注意的是,有些網(wǎng)站在打開頁面時(shí),涉及到一系列HTTP請求,這些請求可能存在登錄和功能現(xiàn)實(shí)相分離的現(xiàn)象。此時(shí)就需要對登錄時(shí)建立的Cookie數(shù)據(jù)進(jìn)行保留,并將其傳入所有的后續(xù)HTTP請求參數(shù)中,該參數(shù)通過Http Web Request.Cookie Container進(jìn)行填充。
3.2 HTML解析技術(shù)
以HTTP爬蟲方式得到的文檔數(shù)據(jù)為字符串形式的HTML,為了能方便地對其進(jìn)行處理,需要將其轉(zhuǎn)換為具有邏輯結(jié)構(gòu)的DOM樹并進(jìn)行解析,該文使用HtmlAgilityPack庫實(shí)現(xiàn)此功能。HtmlAgilityPack是一個基于.net的第三方解析庫,可以無縫兼容C#。
HtmlAgilityPack利用該庫中的HtmlDocument.LoadHtml()加載字符串形式的HTML,并將其轉(zhuǎn)換為DOM樹。為了能對HTML中的某一段特征碼進(jìn)行對比分析,需要快速定位該特征碼所在路徑。此功能通過HtmlDocument的DocumentNode.SelectSingleNode(_xpath)來實(shí)現(xiàn),方法的參數(shù)xPath是用于定位的HTML結(jié)構(gòu)路徑。
3.3 多線程技術(shù)
由于網(wǎng)絡(luò)爬取操作較為耗時(shí),為了提高監(jiān)控效率并避免程序出現(xiàn)假死現(xiàn)象,需要采用多線程技術(shù)。在該系統(tǒng)中,設(shè)置一個隊(duì)列用于存儲需要爬取資源的任務(wù)。系統(tǒng)使用System.Threading.Thread來構(gòu)建線程對象,對于每個線程對象,依次從隊(duì)列中取出任務(wù)來執(zhí)行爬取操作。為了避免出現(xiàn)操作沖突,需要將隊(duì)列的進(jìn)隊(duì)和出隊(duì)代碼設(shè)置臨界區(qū),這里使用lock鎖來實(shí)現(xiàn)該功能。
4? 結(jié)語
電子文獻(xiàn)是高校開展科研和教學(xué)活動的重要保障,對其資源庫的可用性進(jìn)行監(jiān)控具有明顯的現(xiàn)實(shí)意義。該文利用網(wǎng)絡(luò)爬蟲的原理,對電子文獻(xiàn)資源庫可用性監(jiān)控的相關(guān)技術(shù)展開了研究。該類監(jiān)控技術(shù)具有良好的平臺無關(guān)性,可適用于各類B/S結(jié)構(gòu)的資源服務(wù)器。我們相信,隨著互聯(lián)網(wǎng)及文獻(xiàn)信息化的發(fā)展,電子文獻(xiàn)資源監(jiān)測技術(shù)將會發(fā)揮出更大的作用。
參考文獻(xiàn)
[1] 王思敏,尹伊秋,宣靜雯,等.基于網(wǎng)絡(luò)爬蟲技術(shù)的數(shù)字資源檢測軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2019,42(10):132-135.
[2] 何征強(qiáng).電子資源使用監(jiān)測系統(tǒng)實(shí)例研究[J].大學(xué)圖書情報(bào)學(xué)刊,2017,35(2):105-108.
[3] 李海燕,宓永迪.公共圖書館數(shù)字資源故障自動檢測系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)——以浙江圖書館為例[J].內(nèi)蒙古科技與經(jīng)濟(jì),2015(18):62-63,66.
[4] 魯豐玲.基于Scrapy的招聘信息爬蟲設(shè)計(jì)與實(shí)現(xiàn)[J].科技資訊,2019,17(20):7-10.
[5] 侯潔茹,呂繼續(xù).基于Python的天貓商品爬蟲技術(shù)[J].科技資訊,2019,17(32):10,12.
[6] 單文遠(yuǎn).分布式主題網(wǎng)絡(luò)爬蟲研究與設(shè)計(jì)[D].電子科技大學(xué),2020.