袁 望
(暨南大學(xué),廣東 深圳 518053)
網(wǎng)絡(luò)爬蟲(Web Cracker)是一種能夠?qū)崿F(xiàn)對(duì)網(wǎng)頁(yè)內(nèi)容及相關(guān)信息進(jìn)行自動(dòng)化抓取的腳本或程序,該概念自提出至現(xiàn)在,跟隨網(wǎng)絡(luò)環(huán)境、數(shù)據(jù)環(huán)境、技術(shù)環(huán)境的變化,其內(nèi)涵、廣度都在不斷豐富與發(fā)展,目前爬蟲技術(shù)的主流分支包括通用網(wǎng)絡(luò)爬蟲、聚焦網(wǎng)絡(luò)爬蟲、增量式網(wǎng)絡(luò)爬蟲和深層網(wǎng)絡(luò)爬蟲[1];大量的動(dòng)態(tài)網(wǎng)頁(yè)與數(shù)據(jù)庫(kù)的使用,促進(jìn)了深層網(wǎng)絡(luò)爬蟲技術(shù)的研究,即對(duì)“存儲(chǔ)在網(wǎng)絡(luò)數(shù)據(jù)庫(kù)中,不能通過(guò)靜態(tài)鏈接獲取、不能被普通搜索引擎發(fā)現(xiàn),通常需要通過(guò)表單與一系列動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)訪問(wèn)的資源集合”這一類數(shù)據(jù)進(jìn)行爬取[2]。
早期的深層網(wǎng)絡(luò)爬蟲技術(shù)包括引入JavaScript 引擎執(zhí)行相關(guān)交互代碼,并接受返回的所有頁(yè)面URL[3];或是使用標(biāo)準(zhǔn)瀏覽器API,自動(dòng)構(gòu)建模擬瀏覽器以代替http客戶端,從而進(jìn)行腳本處理與頁(yè)面重定向[4]兩類,目前很多網(wǎng)絡(luò)爬蟲的算法設(shè)計(jì)思路都參考了以上部分思想。
傳統(tǒng)的網(wǎng)絡(luò)爬蟲往往使用特定的編程語(yǔ)言,由需求者獨(dú)立編寫腳本程序?qū)崿F(xiàn),這種方式提高了網(wǎng)絡(luò)爬蟲的技術(shù)門檻,并且對(duì)新的技術(shù)環(huán)境往往缺乏敏感性與柔性。因此,本文介紹一種新的基于應(yīng)用程序“后羿采集器”的網(wǎng)絡(luò)爬蟲,對(duì)“土流網(wǎng)”的土地流轉(zhuǎn)信息數(shù)據(jù)庫(kù)進(jìn)行爬取,通過(guò)關(guān)鍵詞檢索、復(fù)合條件篩選對(duì)特定數(shù)據(jù)進(jìn)行動(dòng)態(tài)查詢與爬取,驗(yàn)證“后羿采集器”在深層網(wǎng)絡(luò)中采集數(shù)據(jù)的高效能力。
1.2.1 網(wǎng)絡(luò)爬蟲
網(wǎng)絡(luò)爬蟲技術(shù)泛指一切能夠?qū)崿F(xiàn)對(duì)網(wǎng)頁(yè)的內(nèi)容進(jìn)行自動(dòng)抓取的技術(shù),也是本文使用軟件獲取網(wǎng)站數(shù)據(jù)的基礎(chǔ)技術(shù)。
1.2.2 XPath
XPath 是在XML 文檔中查找信息元素的定位符語(yǔ)言,XPath 可以根據(jù)網(wǎng)頁(yè)結(jié)構(gòu)對(duì)網(wǎng)頁(yè)某一部分的元素進(jìn)行定位,在目前多采用固定框架進(jìn)行布局的網(wǎng)站中,使用XPath 定位特定信息元素有較好的效果。
1.2.3 正則表達(dá)式
正則表達(dá)式即使用一定的特定字符組合,表示相關(guān)的“規(guī)則字符串”,并以此對(duì)目標(biāo)字符串進(jìn)行過(guò)濾、替換等操作;在數(shù)據(jù)爬蟲的應(yīng)用領(lǐng)域,正則表達(dá)式在提取、匹配固定格式信息和構(gòu)建DOM 的方面有良好的效果[5]。當(dāng)前,學(xué)界的一種主流思想認(rèn)為:正則表達(dá)式、XPath 路徑語(yǔ)言、Beautiful Soup 并稱為網(wǎng)絡(luò)爬蟲中對(duì)數(shù)據(jù)的3 種篩選技術(shù)[6]。
1.2.4 后羿采集器
后羿采集器是由商業(yè)技術(shù)團(tuán)隊(duì)開(kāi)發(fā)的一款數(shù)據(jù)采集軟件,在模擬瀏覽器的基礎(chǔ)上,支持智能學(xué)習(xí)采集流程與圖式采集流程,通過(guò)可視化、模塊化的流程圖與封裝的功能模塊,屏蔽了網(wǎng)絡(luò)爬蟲技術(shù)在底層上的實(shí)現(xiàn)細(xì)節(jié),降低了用戶進(jìn)行網(wǎng)絡(luò)爬蟲的技術(shù)門檻,同時(shí)允許用戶通過(guò)編輯正則表達(dá)式、XPath 等方式,制定復(fù)雜、個(gè)性化數(shù)據(jù)采集方案,保留了一定程度的可拓展性與高級(jí)應(yīng)用能力。
步驟(1):安裝并配置“后羿采集器”軟件。
步驟(2):設(shè)計(jì)目標(biāo)任務(wù):選擇“土流網(wǎng)”為數(shù)據(jù)來(lái)源站點(diǎn),根據(jù)給定的“農(nóng)業(yè)用地”為檢索條件,采集相關(guān)土地的流轉(zhuǎn)交易信息。
步驟(3):在“流程圖”模式下,設(shè)計(jì)合理的流程圖,并進(jìn)行首輪網(wǎng)絡(luò)爬蟲測(cè)試,分析數(shù)據(jù)測(cè)試結(jié)果。
步驟(4):根據(jù)首輪數(shù)據(jù)的分析結(jié)果,調(diào)整流程圖細(xì)節(jié),并反復(fù)測(cè)試直至問(wèn)題基本解決。
步驟(5):總結(jié)相關(guān)經(jīng)驗(yàn),得出研究結(jié)論。
由于該軟件的“流程圖模式”是基于采集流程圖進(jìn)行自動(dòng)化的識(shí)別、點(diǎn)擊、交互、采集,因此概念的設(shè)計(jì)即對(duì)本次網(wǎng)絡(luò)爬蟲任務(wù)的自然語(yǔ)言描述:
首先,本次任務(wù)應(yīng)該完成基本的web 頁(yè)面交互——訪問(wèn)URL 資源,提交搜索關(guān)鍵詞與表單,提取頁(yè)面相關(guān)信息,智能完成頁(yè)碼檢測(cè)與翻頁(yè);其次,軟件在爬蟲過(guò)程中應(yīng)當(dāng)擁有一定的程序處理流程,對(duì)于特定事件的判斷、循環(huán)、跳轉(zhuǎn)能夠按照編寫者設(shè)定的規(guī)則進(jìn)行自行處理;最后,需要保證爬取到的數(shù)據(jù)的完整性與真實(shí)性,盡量避免數(shù)據(jù)值缺失、格式混亂等問(wèn)題,且最終能以二維表等規(guī)范形式組織與展示數(shù)據(jù)。
2.2.1 基本流程說(shuō)明與流程圖
根據(jù)概念設(shè)計(jì)中的要求,流程圖最終設(shè)計(jì)為圖1 所示,主要分為打開(kāi)網(wǎng)頁(yè)、模擬搜索、提取數(shù)據(jù)循環(huán)、自動(dòng)分頁(yè)循環(huán)、特定數(shù)據(jù)判斷五大部分。其中模擬搜索負(fù)責(zé)通過(guò)動(dòng)態(tài)交互的方式請(qǐng)求后臺(tái)返回相關(guān)數(shù)據(jù)庫(kù)與URL;兩類循環(huán)(提取數(shù)據(jù)循環(huán)、自動(dòng)分頁(yè)循環(huán))框架由軟件自行形成,是完成自動(dòng)遍歷頁(yè)面、自動(dòng)采集等動(dòng)作的主要部分;特定數(shù)據(jù)判斷則是為了解決后續(xù)出現(xiàn)的數(shù)據(jù)缺失問(wèn)題所設(shè)置的邏輯分支結(jié)構(gòu)。
圖1 網(wǎng)絡(luò)爬蟲流程圖
2.2.2 主要功能需求與解決方案
(1)建立統(tǒng)一動(dòng)作的流程圖
當(dāng)模擬瀏覽器首次訪問(wèn)該網(wǎng)站頁(yè)面時(shí),網(wǎng)站的一段JavaScript 代碼會(huì)主動(dòng)觸發(fā)運(yùn)行,通過(guò)讀取cookie 是否為第一次訪問(wèn)該網(wǎng)站,對(duì)首次訪問(wèn)網(wǎng)站的瀏覽器彈出“安全提示”窗口,且需要用戶點(diǎn)擊確定后才能繼續(xù)與頁(yè)面交互。
該動(dòng)作影響了統(tǒng)一流程圖的建立,因?yàn)閺棿爸怀霈F(xiàn)一次,因此不能添加“點(diǎn)擊頁(yè)面元素”步驟來(lái)響應(yīng)彈窗,而是應(yīng)該從cookie 記錄方面入手解決。
圖2 彈窗HTML+JavaScript 示意
因此,在建立流程圖前,使用“后羿采集器”提供的“預(yù)登錄”功能,完成第一次訪問(wèn)動(dòng)作,留下訪問(wèn)記錄的cookie,以防彈窗干擾自動(dòng)采集流程。
(2)自動(dòng)檢索與提取列表
在詳情頁(yè)中,發(fā)現(xiàn)詳情頁(yè)列表采用<div>標(biāo)簽+float屬性的布局方式,而非<ul>標(biāo)簽+<li>標(biāo)簽進(jìn)行嵌套的列表式布局,導(dǎo)致若使用采集器的自動(dòng)識(shí)別列表模式,將得到錯(cuò)誤的鍵——值關(guān)系——所有div 標(biāo)簽內(nèi)的內(nèi)容都會(huì)作為數(shù)據(jù)被采集,而其中占一半數(shù)量的div 內(nèi)的文字實(shí)際應(yīng)該為屬性名,而不是具體數(shù)值。(如圖3)
圖3 數(shù)據(jù)布局方式
因此,此處應(yīng)使用手動(dòng)編輯XPath 的方式進(jìn)行數(shù)據(jù)定位,根據(jù)頁(yè)面結(jié)構(gòu)特點(diǎn),修改后的XPath 示例如圖4。
圖4 用于標(biāo)準(zhǔn)化信息內(nèi)容與格式的XPath
相比修改前,修改后的數(shù)據(jù)具有二維表的形態(tài),不僅保證了數(shù)據(jù)的準(zhǔn)確性與完整性,更有利于后續(xù)數(shù)據(jù)的歸類與使用。(如圖5)
圖5 數(shù)據(jù)格式對(duì)比,左圖為修改前,右圖為修改后
2.3.1 行政區(qū)級(jí)字段處理
為了方便查找該土地所在的省市信息,在原有數(shù)據(jù)“地點(diǎn)”的基礎(chǔ)上,通過(guò)編寫正則表達(dá)式,對(duì)地點(diǎn)信息中的省級(jí)行政區(qū)進(jìn)行提取劃分,形成新字段“省份”。
通過(guò)觀察,該網(wǎng)站前端顯示土地所在地點(diǎn)信息時(shí),使用“/”字符分割省級(jí)區(qū)劃與其他行政區(qū)劃,因此使用正則替換,提取土地名稱中第一個(gè)“/”字符前的漢字,沒(méi)有“/”則代表地點(diǎn)信息僅包含省級(jí)信息,直接提取所有漢字。
詳細(xì)實(shí)現(xiàn)的正則替換方式如下:
查找內(nèi)容:“([u4e00-u9fa5]+)([S]*)”;替換為:“$1”。
2.3.2 對(duì)缺失關(guān)鍵字段的深入采集
在首輪爬蟲結(jié)果中,發(fā)現(xiàn)土地的“帶看費(fèi)”數(shù)據(jù)缺失較為嚴(yán)重,通過(guò)瀏覽器追蹤其詳情頁(yè),發(fā)現(xiàn)網(wǎng)頁(yè)中未顯示相關(guān)信息,查看其JavaScript 動(dòng)態(tài)處理,發(fā)現(xiàn)因未知原因,其后臺(tái)對(duì)于部分詳情頁(yè)面不會(huì)返回“帶看費(fèi)”數(shù)據(jù)信息,此時(shí)前端的js 代碼自動(dòng)對(duì)缺失數(shù)據(jù)設(shè)置隱藏效果(display:none),讓網(wǎng)絡(luò)爬蟲無(wú)法提取到任何字段。
解決該問(wèn)題的方式是,在流程圖中增加一個(gè)判斷模塊,并配合手動(dòng)編寫XPath,判斷頁(yè)面是否存在含有“帶看費(fèi)”字符的標(biāo)簽,如果沒(méi)有,則說(shuō)明當(dāng)前頁(yè)面無(wú)法提取到“帶看費(fèi)”數(shù)值,需要進(jìn)一步通過(guò)點(diǎn)擊“詳情訂購(gòu)頁(yè)面”URL,在訂單結(jié)算頁(yè)面獲取帶看費(fèi)價(jià)格并返回,詳細(xì)實(shí)現(xiàn)如圖6。
圖6 進(jìn)一步挖掘信息的XPath 定位
2.3.3 有效數(shù)據(jù)的單位處理
提取到的“帶看費(fèi)”只有數(shù)值,沒(méi)有價(jià)格單位,且考慮到同樣身為價(jià)格的“土地價(jià)格”單位為“萬(wàn)元/平方米”,因此數(shù)據(jù)表中“帶看費(fèi)”的價(jià)格需要明確,以防止單位誤用。
因此,編寫正則表達(dá)式進(jìn)行正則替換:
查找內(nèi)容:“([+-]?d+(.d+)?)”;替換為:“$1 元”。
該表達(dá)式的主要作用有:a.匹配內(nèi)容為有效數(shù)字(包括帶小數(shù)位的數(shù)字)的字符串(即排除空值);b.如果為有效數(shù)字,則在末尾添加字符“元”。
如表1 所示,第一次網(wǎng)絡(luò)爬蟲目標(biāo)設(shè)定為960 條數(shù)據(jù),數(shù)據(jù)采集結(jié)果中出現(xiàn)了較高比例的“帶看費(fèi)”屬性值缺失;對(duì)流程進(jìn)行修正與優(yōu)化后開(kāi)始第二次網(wǎng)絡(luò)爬蟲,共計(jì)1920 條目標(biāo)數(shù)據(jù)。
表1 兩次數(shù)據(jù)采集結(jié)果對(duì)比
兩次采集中,各類數(shù)據(jù)占總體的比例大致相當(dāng),“全空數(shù)據(jù)”的存在說(shuō)明“后羿采集器”軟件在實(shí)際運(yùn)行中受到主機(jī)環(huán)境、網(wǎng)絡(luò)環(huán)境的影響,有大約5%的出錯(cuò)、失去響應(yīng)概率,但不影響整體采集流程;“帶看費(fèi)缺失”說(shuō)明該網(wǎng)站服務(wù)器提供的數(shù)據(jù)本身存在一定缺陷,即使對(duì)流程進(jìn)行了優(yōu)化,仍存在數(shù)據(jù)的缺失,導(dǎo)致了40%-50%左右的土地信息缺乏相應(yīng)屬性值。
第二次采集中,經(jīng)過(guò)修正后的流程,補(bǔ)充了9%左右的“帶看費(fèi)”屬性值,說(shuō)明優(yōu)化后的方案對(duì)提高數(shù)據(jù)完整性起到了一定的作用。
“后羿采集器”的智能采集與識(shí)別功能是對(duì)一系列優(yōu)秀算法思想(例如啟發(fā)式算法[7]、網(wǎng)頁(yè)樹(shù)狀結(jié)構(gòu)映射[8]、基于自動(dòng)生成XPath 的定位[9]等)的封裝、應(yīng)用與拓展,對(duì)初學(xué)者而言,使用集成功能的軟件能夠迅速完成基本的網(wǎng)絡(luò)爬蟲任務(wù),是進(jìn)行網(wǎng)絡(luò)爬蟲工作的理想選擇之一。然而,一來(lái)目前網(wǎng)絡(luò)爬蟲的技術(shù)棧仍然處于持續(xù)更新?tīng)顟B(tài),對(duì)新技術(shù)的支持與兼容往往取決于集成功能軟件開(kāi)發(fā)者的更新進(jìn)度,而非使用者的意愿;二來(lái)“自動(dòng)翻頁(yè)”“智能采集”等自動(dòng)生成算法的最終質(zhì)量也依賴于具體算法的迭代與優(yōu)化。因此,網(wǎng)絡(luò)爬蟲需要根據(jù)實(shí)際需求,選擇合適的工具,不能盲目迷信單一技術(shù)或手段。
使用“后羿采集器”進(jìn)行的網(wǎng)絡(luò)爬蟲設(shè)計(jì)與實(shí)現(xiàn),能夠達(dá)到數(shù)據(jù)采集的基本需求,采集到的數(shù)據(jù)除部分缺失“帶看費(fèi)”之外,均包括地址、年限、用途、類型、價(jià)格等重要交易信息,仍然保留著較高的信息分析價(jià)值,可以為研究土地產(chǎn)權(quán)、農(nóng)村土地流轉(zhuǎn)等土地科學(xué)問(wèn)題貢獻(xiàn)社會(huì)經(jīng)濟(jì)數(shù)據(jù)。