劉 耀,劉 茹,翟 雨
(1.中國科學技術信息研究所 信息技術支持中心,北京 100038;2.北京大學 軟件與微電子學院,北京 102600)
網(wǎng)絡信息資源中存在著大量極具參考價值的學術信息、社會信息,大數(shù)據(jù)浪潮推動了網(wǎng)絡資源的爆發(fā)式增長,使網(wǎng)絡資源的分類、聚合、組織與展示形態(tài)以更具多樣化的方式呈現(xiàn),給網(wǎng)絡信息的自動化采集與挖掘技術帶來了挑戰(zhàn)。一方面,現(xiàn)存面向單一語境的網(wǎng)頁信息提取方法適應性和泛化能力較差,難以滿足高度自動化的網(wǎng)頁信息采集需求;另一方面,網(wǎng)頁改版事件頻繁發(fā)生,導致爬蟲代碼中網(wǎng)頁實體抽取模塊代碼失效,需要大量人力進行修復和維護。
由于實體抽取模塊代碼基本以XPath(XML Path language)或CSS(Cascading Style Sheets)選擇器代碼為主,這部分代碼反映了網(wǎng)頁源碼中目標實體的位置結構、文本標識等信息,是爬蟲待獲取的目標實體在網(wǎng)頁源碼中的直接反映。本文提出基于網(wǎng)頁源碼結構理解的自適應爬蟲代碼生成方法,從網(wǎng)頁源碼變動的泛化感知能力、自適應性生成爬蟲代碼能力方面對通用網(wǎng)絡爬蟲的自適應性展開研究,旨在針對網(wǎng)頁改版實現(xiàn)網(wǎng)頁信息自動化采集,提高爬蟲系統(tǒng)的自適應能力。
本文的主要工作包括3 個方面:1)通過分析爬蟲業(yè)務流程和面向網(wǎng)頁改版事件的爬蟲代碼報錯類型,揭示網(wǎng)頁源碼的結構變動類型和爬蟲代碼的適應性修改間的關聯(lián);2)依據(jù)網(wǎng)頁源碼變動的結構、內(nèi)容特征、爬蟲代碼特征和目標實體文本特征,采用樹節(jié)點分類、語義相似度等方法從自動生成和相似推薦兩個角度提出基于網(wǎng)頁源碼結構變動程度的爬蟲代碼生成方案;3)提出用于表征網(wǎng)頁源碼變動的、編碼器-解碼器(Encoder-Decoder,ED)與網(wǎng)絡表示學習相結合的嵌入表示方法,有效地提高了代碼生成模型的準確率和對網(wǎng)頁源碼變動感知的泛化能力。
爬蟲研究在廣義上指基于對網(wǎng)絡通信和網(wǎng)頁源碼理解的自動化工具研究,通過一定的策略沿著由網(wǎng)頁鏈接節(jié)點構成的拓撲網(wǎng)絡中的信息采集工具。狹義上指面向單個網(wǎng)頁的網(wǎng)頁信息抽取技術。
爬蟲軟件的自適應性研究方面,一些以自適應為標題的研究[1-4]并未從自適應性系統(tǒng)的角度切入,仍停留在提出實現(xiàn)爬蟲某一環(huán)節(jié)的自動實現(xiàn)方法研究階段,如網(wǎng)頁信息自動抽取、網(wǎng)頁自動下載等。爬蟲技術相關研究中,針對網(wǎng)頁變動的爬蟲研究較少。Cohen 等[5]提出針對網(wǎng)頁變動從子樹匹配的角度提出XPath 生成方法;Choudhary 等[6]從Web 應用自動化測試的角度對網(wǎng)頁源碼的變動進行研究,將變動前后的網(wǎng)頁源碼進行關聯(lián)研究。目前較為主流且工程性的網(wǎng)頁信息自動抽取方法仍多以XPath 路徑表達式模板為主,因此針對XPath的自動生成研究也較多,如Cohen 等[5]提出DOM(Document Object Mode)樹子樹匹配的方法自動化地生成XPath 代碼;Jundt等[7]提出基于規(guī)則生成XPath 后與檢索詞之間關聯(lián)程度的排序機制;吳共慶等[8]同樣對XPath 進行研究,提出了區(qū)分噪聲的網(wǎng)頁正文提取方法?;跈C器學習的網(wǎng)頁信息自動抽取方面,在利用機器學習或深度學習的爬蟲技術研究中,有些學者利用了網(wǎng)頁超文本標記語言(Hyper Text Markup Language,HTML)源碼的強結構性特征,利用深度學習中的圖論對網(wǎng)頁源碼進行表示學習,如Gogar等[9]提出基于卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network,CNN)的DCNN(Deep CNN)圖像分類器,結合機器視覺的方法進行網(wǎng)頁信息抽??;Tan 等[10]提出將網(wǎng)頁中的鏈接構建成網(wǎng)絡,提取釣魚網(wǎng)頁的超鏈接文本特征,從而建立網(wǎng)絡釣魚檢測的隨機森林分類器,并通過對比支持向量機、樸素貝葉斯等分類器,驗證了隨機森林算法在圖模型分類任務中效果相對最好。
代碼表示學習大多采用word2vec(word to vector)、doc2vec(document to vector)或基于長短期記憶(Long Short-Term Memory,LSTM)的序列網(wǎng)絡模型,如code2seq(code to sequence)方法[11]主要通過LSTM 網(wǎng)絡對代碼文本進行表示,對代碼片段進行序列化向量表示。Li 等[12]提出的word2API(word to API)則通過詞嵌入技術對自然語言中的詞組與程序語言中的應用程序編程接口(Application Programming Interface,API)進行聯(lián)合建模,以解決跨語言匹配過程中出現(xiàn)的詞不匹配問題。但這些代碼的語義表示方法通常只利用代碼的淺層文本語義特征,未能結合代碼本身的強結構性特征。文獻[13-14]在網(wǎng)絡表示學習方法上提出不同的改進機制,其中PGE(Property Graph Embedding)模型使用節(jié)點聚類以分配偏差區(qū)分節(jié)點的鄰居,并利用基于鄰居的有偏采樣機制融合更多的屬性信息,相較于DeepWalk 的基線模型提升了10 個百分點,比圖卷積網(wǎng)絡(Graph Convolutional Network,GCN)提升了3 個百分點。文獻[15]提出對圖模型之間的映射關系建模的Graph-to-Graph 算法。
網(wǎng)絡表示學習的基本原理如圖1,不同灰度用于區(qū)分不同節(jié)點,首先按需生成隨機游走,將網(wǎng)絡中的節(jié)點當作句子的詞,節(jié)點的連接信息當作句子在模型中進行訓練,最后獲得每個節(jié)點地位稠密的向量表示。本文認為可通過構建代碼的圖模型,采用圖神經(jīng)網(wǎng)絡研究中的網(wǎng)絡表示學習模型對網(wǎng)頁的HTML源碼及爬蟲的代碼及XPath等結構表達式進行表示學習。
圖1 網(wǎng)絡表示學習原理Fig.1 Principle of network representation learning
本文結合自適應軟件理論思想[16-17],提出了自適應爬蟲可借鑒自適應軟件的控制理論。一方面,通過建立深度結構化的源碼知識庫和代碼決策庫,將HTML 網(wǎng)頁源碼和爬蟲代碼各自表示為融合標簽和語義結構信息的圖嵌入表示;另一方面,針對網(wǎng)頁源碼的結構性變動特征進行表示學習,采用深度學習技術建立從HTML 源碼的變動到爬蟲代碼間的映射生成模型,從而實現(xiàn)具備自適應感知、自適應代碼生成更新及激活能力的自適應爬蟲系統(tǒng)。并且連通自適應系統(tǒng)的各個環(huán)節(jié),形成完整的“感知-決策-執(zhí)行-評價”業(yè)務閉環(huán),以有效解決真實的場景問題。
自適應代碼生成之前需要經(jīng)過網(wǎng)頁源碼(下文簡稱源碼)解析及其變動感知過程,而對源碼變動的感知建立在對源碼結構及其語義特征深度理解的基礎上,本章以HTML DOM 樹和Java 抽象語法樹為指導,通過源代碼結構化解析方法實現(xiàn)網(wǎng)絡資源獲取過程中網(wǎng)站樣式改版問題必需的資源深度解析任務。為了完成對資源的深層語義加工,為后續(xù)的源代碼映射建模提供數(shù)據(jù)基礎,首先需要在理解源碼的基礎上進行元素節(jié)點分類,其次需要完成結構相似度計算。待分類的對象是源碼中的一個元素標簽及其屬性和文本,通常屬于篇幅較小的短文本分類問題??紤]圖表示學習算法可以對構建好的代碼DOM 樹進行向量訓練,利用圖神經(jīng)網(wǎng)絡中的節(jié)點分類算法更適合本文的研究任務。本文采用XGBoost(Extreme Gradient Boosting)梯度提升樹[18]的改進算法。
網(wǎng)頁改版前后HTML 源碼的變動特征與改版前的爬蟲代碼特征是修復停滯的爬蟲業(yè)務流程、生成新爬蟲代碼的重要依據(jù)。本文從源碼結構性變動程度、布局類型變動和局部節(jié)點變動(橫向、縱向變動)這3 個層面對源碼變動進行度量,將網(wǎng)頁源碼的變化特征結合其對應代碼特征,將源碼變化類型分為兩種:1)父級元素不變化,目標元素在父級元素范圍內(nèi)的變化;2)父級元素發(fā)生改變的大規(guī)模源碼變化。
如表1 所示,源碼結構性變動以出錯的目標實體為具體對象,變動程度分為結構性變動和非結構性變動。結構性變動又代表布局結構類型變動,意味著網(wǎng)頁改版事件不僅導致某幾處實體發(fā)生局部的橫向或縱向移動或?qū)傩詢?nèi)容變化,而且整篇源碼的結構和內(nèi)容均發(fā)生多處改變,最直接的影響是原本的XPath 代碼所對應的父節(jié)點與子節(jié)點均在新源碼中找不到對應。區(qū)分方法以源碼的結構性差異為特征,采用特征融合方法訓練結構差異閾值,作為網(wǎng)頁源碼變動類型的判斷依據(jù)。本文涉及的網(wǎng)頁布局結構類型是基于對HTML 源碼結構理解、目標實體在源碼中分布的次序信息等先驗知識的總結與歸納,對修剪后的網(wǎng)頁源碼DOM 樹進行分類,從而得到布局結構的源碼特征。
表1 源碼的7種變動類型Tab.1 Seven change types of source code
對于爬蟲代碼的生成方式,實體抽取、實體解析代碼分別采用不同的方法生成。實體抽取代碼一方面依據(jù)源碼的變動特征,可通過計算發(fā)生相似變動的源碼集合推薦這些源碼所對應的變動類型,進而確定源碼變動范圍;另一方面,可通過分類算法對源碼中的節(jié)點進行分類預測,結合源碼變動特征確定待分類的節(jié)點集合范圍,從而得到分類為目標實體標簽的元素對應XPath,最終經(jīng)排序?qū)W習得到最準確的實體抽取代碼。解析代碼與實體抽取代碼類似,可依據(jù)網(wǎng)頁改版特征推薦最相似的變動類型所對應的代碼變動類型,只不過需要廣泛地從網(wǎng)絡資源中獲取相關代碼,作為排序與推薦計算的數(shù)據(jù)基礎。
雖然基于源碼結構理解與源碼變動類型判斷的爬蟲代碼生成方法可以一定程度地提高代碼生成與推薦的準確性(見3.3 節(jié)實驗部分),但是這種多種傳統(tǒng)自然語言處理手段疊加的方法在自適應感知與決策任務上仍存在一定的局限性,表現(xiàn)為缺乏靈活表征源碼變動的能力,以及代碼生成模型的有限生成能力,無法面向未知的源碼變動情況自適應地生成爬蟲代碼。因此,本節(jié)在前文基礎上提出一種泛化的、自適應的源碼變動感知及爬蟲代碼自適應生成模型。
如圖2 所示,首先以通用的、泛化的源碼變動表示方法代替源碼變動類型判定方法;其次基于深度學習模型中的端到端模型,將“變動前源碼-變動后源碼”的變動內(nèi)容、變動前爬蟲代碼作為代碼生成模型的嵌入層,以變動后代碼為輸出層,構建源碼變動-代碼的映射模型。
圖2 源碼變動下的自適應爬蟲代碼生成模型Fig.2 Adaptive Web crawler code generation model under source code changes
圖2 中,W(t)代表t時刻節(jié)點;X1、X2和X3表示輸入變量,分別對應模型提出的源碼變動表征、源碼表征和代碼表征;Y1是輸出變量,即要預測的代碼對象。若將變化前源碼記為A,變化后記為A',變化前代碼記為B,變化后記為B',本文的目的即為構建{[(A-A')+(AA')+(A-B)]-B′}的關聯(lián)映射模型。通過融合源碼變動特征、源碼自身結構語義特征、源碼-代碼關聯(lián)映射這3 種特征,利用網(wǎng)絡表示學習與ED 模型對源代碼的雙層表征,再利用Seq2Seq(Sequence to Sequence)模型以3 種特征為嵌入層,以爬蟲代碼為輸出層,構建源代碼映射的代碼生成模型。
爬蟲代碼生成任務可分解為網(wǎng)頁改版類型判定與代碼生成兩部分。本章介紹源碼變動程度計算以及代碼生成技術,將前文提到的兩種代碼生成模型分別進行實驗,展示傳統(tǒng)自然語言處理方法疊加的爬蟲代碼生成與不區(qū)分變動類型的源代碼映射代碼生成模型結果。
表1 中3 種源碼變動類型是基于源碼結構性變動程度劃分的。在源碼結構性變動度量方面,針對大規(guī)模結構變動和局部(即小規(guī)模)結構變動,自然語言處理方法疊加的源碼結構性變動程度計算與爬蟲代碼生成方法如下。
第一,源碼變動程度計算方法。針對大規(guī)模結構變動,結合相似度計算、差異值計算的綜合結構差異指標,并在源碼結構表示的基礎上對源碼整體結構進行計算。其中,相似度計算由余弦相似度和KL 散度(Kullback-Leibler divergence)共同衡量,將二者相加作為綜合結構差異指標。余弦相似度是數(shù)學空間中的兩向量之間距離的衡量指標,以兩個向量夾角的余弦值來衡量個體間的差異。KL散度又稱相對熵,在信息論中,KL 散度可以有效地度量兩個概率質(zhì)量分布差異度,它在信息學、統(tǒng)計學和物理學等領域中得到了廣泛的應用[19]。KL散度要求待對比的兩個分布具有相同的樣本數(shù)目,而本文待對比的對象是兩個網(wǎng)頁源碼,兩條數(shù)據(jù)中的節(jié)點數(shù)目即樣本數(shù)目難以完全相同,因此需依據(jù)重要性對HTML 源碼中的標簽節(jié)點進行排序,選取相同數(shù)目的節(jié)點作為計算對象。本文采用PageRank 方法對DOM 樹節(jié)點排序。首先,通過源碼屬性名稱白名單對網(wǎng)頁源碼進行語義信息的刪減、合并源碼中的最小結構體,從而排除網(wǎng)頁內(nèi)容的語義差異和非HTML 語言的外部信息,構建修剪后的DOM 結構樹;其次,利用樹編輯距離指標衡量源碼結構的變化程度,用余弦相似度和KL散度綜合計算變化前后源碼的相似程度;每個網(wǎng)站訓練出一個平均閾值代表對結構變動的容忍值,當某一時刻,兩個網(wǎng)頁源碼之間的樹編輯距離值大于該閾值時,則認為源碼發(fā)生了較大的結構差異。網(wǎng)頁源碼的非結構性變動即為源碼差異小于閾值時的情況,表現(xiàn)為網(wǎng)頁結構變動幅度較小,則實體抽取代碼失效的原因在于元素的屬性標識發(fā)生變化,在原父節(jié)點的子節(jié)點集合中重新識別目標實體。
第二,代碼生成方法。XPath 代碼的本質(zhì)是通過一系列規(guī)則符號、針對目標實體的、對源碼中目標實體的位置屬性標識等特性的邏輯表達,因此網(wǎng)頁改版事件導致的源碼文本及結構變化中,與目標實體關聯(lián)的部分直接映射在了XPath代碼中,只要掌握了源碼的變動方向,再通過局部源碼的分類與判定如DOM 樹節(jié)點分類方法,即可得到目標實體的位置、屬性標識等一系列特征,通過這些特征又可直接轉(zhuǎn)換為XPath 模板代碼,重新激活爬蟲流程,爬取更多的網(wǎng)頁數(shù)據(jù)。
爬蟲原始資源基本分為網(wǎng)頁源碼資源、爬蟲代碼資源、日志數(shù)據(jù)這3 方面資源,這些資源達成了本文所面向的自適應感知、爬蟲生成以及決策激活的目標。具體包括網(wǎng)頁HTML 源碼、系統(tǒng)內(nèi)爬蟲項目代碼、外部網(wǎng)絡資源中的爬蟲代碼、爬蟲日志數(shù)據(jù)庫的資源。
爬蟲完成獲取網(wǎng)頁源碼的原始資源數(shù)據(jù)后,將網(wǎng)頁源碼連同它對應的獲取和解析代碼共同存儲在Mongo 數(shù)據(jù)庫(MongoDB)中,以時間戳標記源碼及代碼的入庫時間,以便統(tǒng)計網(wǎng)頁改版事件引起的網(wǎng)頁源碼變動特征。網(wǎng)頁源碼資源庫充分結合了語料特點和爬蟲業(yè)務目標,一方面依據(jù)HTML 的DOM 樹結構特征存儲樹狀的資源結構,另一方面按照網(wǎng)頁源碼特點存儲網(wǎng)頁布局結構字段,以及爬蟲待獲取的目標實體字段。代碼資源庫則利用抽象語法樹(Abstract Syntax Tree,AST)一方面從Java 代碼中提取樹狀結構語義,以及核心的方法名、類名、依賴等文本語義信息;另一方面則結合爬蟲業(yè)務特點,設置了爬蟲下載器、解析器、調(diào)度器、存儲管道等字段。代碼資源庫的資源由爬蟲采集各大網(wǎng)絡博客網(wǎng)站所構成。通過人工數(shù)據(jù)清洗與信息抽取,獲取網(wǎng)頁中的代碼片段及自然語言描述。爬蟲日志數(shù)據(jù)庫記錄的是以網(wǎng)頁為單元的每個爬蟲線程在爬蟲業(yè)務鏈條各階段的行動軌跡,包括線程停止時的運行狀態(tài)、出錯類型、捕獲異常、獲取到的中間數(shù)據(jù)等單個爬蟲線程的全部生命歷程。
本節(jié)所提出的源碼變動特征標引與實體抽取代碼生成方法重點在于:1)通過節(jié)點分類方法識別目標實體,自動生成XPath 代碼;2)通過計算源碼結構變化閾值特征,鎖定目標節(jié)點的變動范圍,縮減待分類節(jié)點的候選集合;3)通過定位父級元素、合并最小結構體等DOM 樹修剪方法,縮減待分類的節(jié)點范圍,提高代碼生成效率。
爬蟲代碼生成實驗的具體步驟如下:
步驟1 數(shù)據(jù)準備。依據(jù)網(wǎng)頁源碼資源庫,即標引好源碼及其XPath 抽取代碼對應關系的數(shù)據(jù)庫,可進一步標引DOM 樹中節(jié)點的分類標簽。
步驟2 預訓練向量準備。采用網(wǎng)絡表示學習算法對HTML 源碼進行表示學習,得到源碼中各個節(jié)點對應的向量表示。
步驟3 分類模型訓練。從網(wǎng)絡表示學習得到的doc2vec 向量中提取對應節(jié)點的向量矩陣,輸入XGBoost 監(jiān)督學習的分類模型。
步驟4 XPath 自動生成。對網(wǎng)頁源碼中的節(jié)點進行分類,得到候選節(jié)點集合,每個節(jié)點自動生成其XPath 代碼。
本文從源碼庫81 393 條結構化解析完畢的源碼數(shù)據(jù)中,按照網(wǎng)頁信息抽取代碼的差異統(tǒng)計網(wǎng)頁源碼樣式種類,自2019年7月爬蟲平臺上線以來,統(tǒng)計來自190個網(wǎng)站的526種樣式,其中包含有效XPath代碼的樣式506種。本文依據(jù)樣式類型每種樣式隨機選取50 條源碼,從25 300 條源碼數(shù)據(jù)中再依據(jù)結構化的分類體系提取各分類標簽對應的源碼中節(jié)點文本。經(jīng)網(wǎng)絡表示學習訓練后,得到融合源碼拓撲結構信息、節(jié)點的語義信息以及節(jié)點的分類信息的300 維向量表示,以此訓練得到節(jié)點分類器模型。本文依據(jù)爬蟲日志數(shù)據(jù)庫記錄的錯誤數(shù)據(jù)展開統(tǒng)計,選取2021 年連續(xù)7 d 內(nèi)的每日報錯數(shù)據(jù)作為實驗對象,以檢驗本文提出的實體抽取規(guī)則代碼生成方法的有效性,具體數(shù)據(jù)以及實驗結果如表2所示。
表2 爬蟲日志庫的數(shù)據(jù)統(tǒng)計Tab.2 Data statistics of Web crawler log database
從表2 可知,爬蟲自適應生成實體抽取代碼方法整體表現(xiàn)出了較強的修復能力,在標題、日期、正文這3 個目標實體的抽取代碼生成上具有較好的適應性;在分類模型準確率方面,XGBoost 模型在驗證集上的準確率達到88%左右,系統(tǒng)平臺中真實預測的準確率平均在82.9%?;诓季纸Y構判定和子節(jié)點分類得到的目標元素及其父節(jié)點在XPath 代碼的轉(zhuǎn)換率方面表現(xiàn)良好,基本維持在90%以上(如表3所示),主要出錯原因在于部分元素的標識不唯一,轉(zhuǎn)換的XPath 代碼常常難以定位到目標元素。
表3 自適應生成實體抽取代碼方法的準確率Tab.3 Accuracy of adaptive entity extraction code generation method
通過上述正文錯誤類型感知及正文抽取代碼生成實驗,本節(jié)所構建的錯誤感知器在實體抽取錯誤感知方面,對于捕獲為空的情況具有良好的感知能力,但對于捕獲內(nèi)容正誤的感知能力比較一般;因此后續(xù)可以訓練噪聲分類器模型對爬蟲流程中的錯誤類型作出進一步判斷。就實體抽取代碼生成能力而言,源碼變動類型判定與子節(jié)點分類造成的錯誤累積,使得最終代碼生成平均準確率在78%。源碼的節(jié)點分類模型仍有提升空間。
雖然實驗生成了可用的推薦代碼結果,但基于多種傳統(tǒng)自然語言處理疊加的方法一方面可能造成誤差累積,降低代碼生成的準確率;另一方面,傳統(tǒng)的自然語言處理手段雖然可以建立源代碼間的知識關聯(lián),但在自適應感知與決策任務上仍存在一定的局限性。因此,下文的實驗中引入了自適應感知器以及多層源碼特征表示手段,實現(xiàn)泛化爬蟲代碼生成過程。
自適應爬蟲系統(tǒng)的核心是基于深度感知、自動判別的服務模型,通過構建智能化工具定時監(jiān)控爬蟲應用的內(nèi)外部環(huán)境,實現(xiàn)網(wǎng)頁源碼與爬蟲代碼兩類資源的交互與協(xié)同計算,如表4。前文對實體抽取與解析代碼生成的技術探討,此節(jié)將不再區(qū)分源碼變動的具體類型,而是從受到影響的目標實體、出錯的爬蟲節(jié)點兩方面自適應感知源碼變動。
表4 網(wǎng)頁源碼變動事件判定的內(nèi)外部依據(jù)Tab.4 Internal and external basis for judging webpage source code change events
排除網(wǎng)絡通信條件等硬性外部環(huán)境,本文所研究的爬蟲應用的外部環(huán)境主要指網(wǎng)站的軟件運行狀態(tài)及數(shù)據(jù)內(nèi)容更新情況;爬蟲的內(nèi)部環(huán)境則來自于對爬蟲日志信息的讀取和統(tǒng)計、爬蟲運行狀態(tài)的監(jiān)督。外部環(huán)境的變化一方面直接體現(xiàn)在實體抽取模塊的XPath 代碼上,因為XPath 本質(zhì)上是對HTML 源碼信息的表達,XPath 代碼是否成功解析直接反映出網(wǎng)頁源碼是否發(fā)生變動;另一方面,通過結合內(nèi)外部信息,對比網(wǎng)站實際更新數(shù)目、爬蟲捕獲成功并存儲在Redis(Remote dictionary server)緩存池中的鏈接數(shù),以及爬蟲實際解析成功存儲在MongoDB 的鏈接數(shù),也是判斷網(wǎng)頁源碼變動與否的重要依據(jù)。網(wǎng)頁源碼變動事件判定的內(nèi)外部依據(jù)見表4。
例如,網(wǎng)頁樣式變化導致信息抽取代碼失效,當爬蟲日志數(shù)據(jù)庫中讀取的數(shù)據(jù)滿足條件“status=‘ERROR’ AND type≠‘DOWNLOADER’ AND message ‘content str is empty’”時,判定目標實體“正文”所對應的信息抽取代碼失效,未能在源碼中定位出“正文”對應的元素標簽。
本文以源碼變動前后兩條源碼數(shù)據(jù)即兩個DOM 樹結構中、同一分類標簽的兩個節(jié)點為一組訓練數(shù)據(jù),對變動前后的一組源碼數(shù)據(jù)進行DOM 樹結構化解析、網(wǎng)絡表示學習,抽取發(fā)生變動的節(jié)點對應的向量,構成一組變動前后的節(jié)點對,作為ED 模型的輸入。爬蟲代碼的變動特征以同樣的思路得到表征代碼變動的映射模型。
在ED 模型訓練至第20 次時,模型損失值最低為49.905,BLEU(BiLingual Evaluation Understudy)值最高 為55.58,測試數(shù)據(jù)的準確率達到92.3%。
實驗從前文針對源碼變動的代碼生成結果中抽取來自121個不同網(wǎng)站,236次變動記錄,由不同版本的網(wǎng)頁源碼構成7 813 組源碼變動記錄數(shù)據(jù),包含源碼版本信息、變動前后源碼、變動前后代碼、變動實體類型等。與僅用TriDNR(Tri-party Deep Network Representation)網(wǎng)絡表示學習作為嵌入層的實驗結果對比,發(fā)現(xiàn)利用源代碼表征、源碼變動作為雙層嵌入的方法的實驗結果中有一定的提升,具體實驗結果如表5。
表5 自適應爬蟲代碼生成結果 單位:%Tab.5 Results of adaptive Web crawler code generation unit:%
使用傳統(tǒng)Seq2Seq模型的代碼生成方法中,輸入為網(wǎng)頁源碼,輸出為XPath選擇器,由此生成的代碼形如XPath表達式如“time/@text” “*/@text”等,這樣的代碼能夠獲取網(wǎng)頁中的元素,但大部分不是爬蟲待獲取的目標元素。原因在于,基于TF-IDF(Term Frequency-Inverse Document Frequency)+Seq2Seq的生成模型僅利用詞袋模型為特征,這樣訓練出的模型依賴于詞袋中的語料,當新的源碼輸入時,難以依據(jù)新源碼中的標簽屬性等詞匯生成針對性的爬蟲代碼,這樣的基線模型存在較大的缺陷。
結合本文的研究目標——針對網(wǎng)頁源碼變動的爬蟲代碼生成這一任務,可從兩方面進行評價本節(jié)提出的(TriDNR+ED)+Seq2Seq 模型:源碼變動的表示和代碼生成的有效性。對比前文劃分具體變動類型的方法發(fā)現(xiàn),不區(qū)分變動類型,只對變動進行抽象表示的方法,在代碼生成準確率上略有降低,但在泛化性有一定的提升。另外在代碼的準確率方面,即生成的XPath 代碼正確獲取到爬蟲的目標元素的準確程度方面,本節(jié)的模型表現(xiàn)較優(yōu),原因在于網(wǎng)絡表示學習模型對網(wǎng)頁源碼的結構語義表征具有良好的效果,日期、正文等實體在源碼中的布局結構、與其他元素相關聯(lián)的拓撲結構信息等都得到了有效表示,因此模型在預測這些實體的能力上表現(xiàn)出一定的優(yōu)越性。
在系統(tǒng)應用方面,爬蟲代碼生成的過程激活以網(wǎng)頁改版事件為觸發(fā),連通自適應系統(tǒng)感知、決策、響應等核心決策元件,以成功獲取與存儲數(shù)據(jù)為終點,構成自適應系統(tǒng)完整閉環(huán)。由于自適應爬蟲生成的結果是包含實體抽取與解析兩部分核心代碼在內(nèi)的Java 方法體,爬蟲代碼更新涉及以groovy 腳本為載體的Java 類代碼集成、與以數(shù)據(jù)庫存儲為方法的XPath 代碼集成,而爬蟲激活則主要指自適應生成代碼完畢后的爬蟲線程啟動工作?;玖鞒倘鐖D3 所示。
圖3 爬蟲代碼更新與激活流程Fig.3 Flow of Web crawler code update and activation
以USCC 網(wǎng)站局部源碼結構性變動為例,USCC 網(wǎng)站發(fā)生日期元素結構性變動,日期元素從<div class=”field--type--datetime”>變?yōu)椋紅ime>。對此,自適應爬蟲系統(tǒng)正確定位了新的日期元素,并轉(zhuǎn)換為XPath 代碼發(fā)送給校驗平臺。在存儲至爬蟲數(shù)據(jù)庫正式啟動爬蟲前,對自適應修改的爬蟲代碼進行自動測試和人機交互校對,從而有效降低人工識別錯誤、人工修改爬蟲代碼的系統(tǒng)運維成本,自適應修改的代碼以及校對界面。
本文在源代碼資源結構及內(nèi)容語義理解的基礎上,探討了針對源碼變動的代碼生成模型,并以源碼結構變動為出發(fā)點,對問題進行建模,提出相應的代碼生成或推薦模型,實現(xiàn)了針對錯誤類型的爬蟲代碼自動生成,并且在此基礎上提出一種泛化的、自適應的源碼變動感知及爬蟲代碼自適應生成方法,解決了爬蟲技術面臨的網(wǎng)頁頻繁改版導致代碼失效的實際問題。但本文解決的是源碼局部結構性變動,大規(guī)模源碼結構變動的感知與爬蟲代碼生成方案則有待研究;此外,本文研究目標網(wǎng)站大多屬于智庫網(wǎng)站,因此所提出的特征或許存在一定的領域獨特性,有待其他類型網(wǎng)站布局結構的補充。