劉多林,呂 苗
(沈陽理工大學,遼寧 沈陽 110159)
現階段,大數據逐漸呈爆炸式增長趨勢,雖然為各行業發展提供了契機,但是也為信息采集造成困難。如何確保用戶準確高效地獲取感興趣的信息,是信息技術領域面臨的最大困難。
網絡爬蟲技術的高自動化程度、強擴展性等優勢,很好地解決了待采集數據量大、信息雜亂的問題,該方法的實質是遵守制定好的規則,從網頁中提取相關數據的程序,最初被應用在搜索引擎中,現逐漸應用在數據采集挖掘工作中。例如,劉景發[1]等人提出基于網頁空間進化的爬蟲策略。以計算測試鏈接和種子鏈接之間的最短距離,與鏈接庫中全部鏈接的平均距離作對比,不斷更新鏈接庫;對于多目標優化中最佳解選擇問題,提出最近最遠候選解法,結合候選解確定爬蟲路線。楊宇[2]等人將深度優先策略當作爬蟲方式,設計數據采集方法。利用詞元字符串相似度矩陣提高檢索列表匹配的準確性,在決策樹模式下進行數據識別與采集。
由于數據采集數量的不確定性和爬蟲節點性能差異,上述方法容易出現數據采集重復現象,增加系統內存。為解決這一問題,本文在Scrapy架構[3]下設計一種分布式網絡爬蟲數據采集算法。Scrapy是在Twisted異步網絡庫基礎上開發的爬蟲框架,在數據采集、挖掘等方面具有較高的使用率。此架構中的所有組件均為可插拔的,用戶能結合自身需求對組件重新開發,實現高效爬蟲。此外,分布式網絡爬蟲能夠將大量任務分解為小任務,再對小任務做合并處理,最終完成所有任務,具有較強的協作互聯能力和處理效率。
Scrapy架構包括引擎[4]、調度器、下載器、數據分析與數據管道五方面構成。本文建立的Scrapy架構如圖1所示。

圖1 Scrapy架構示意圖
1)中心引擎:主要工作是管理全部網絡數據流向,每一次的采集工作都必須經過此模塊分析,因此在整個架構中占據關鍵地位,如果該模塊失效,則爬蟲操作將無法完成。
2)調度器:接收來自中心引擎發出的爬蟲任務,同時將該任務放入爬取隊伍中,當中心引擎發出任務請求時,從隊列中選出此任務。這一模塊的主要目的是分類管控爬取任務。
3)下載器:支持網頁下載,通過異步形式構建和服務器之間的連接橋梁,程序無需始終等待服務器的響應,可先執行其它任務,等獲取響應后,再做相應處理。
4)數據解析:是開發者編寫的爬蟲程序,主要工作是解析下載器傳輸來的代碼,可以同時對應很多程序,且任意一個程序都能解析與其對應的網站。
5)數據管道:對上一模塊中的數據做深度處理,包括編碼轉換、清洗與持久化等。
在上述構建的Scrapy架構下,設計分布式網絡爬蟲的體系結構。架構的最下層將分布式平臺作為支撐,上層為爬蟲的不同模塊,通過分布式集群實現網頁數據的保存與計算[5]。原則上這兩部分是無法分割的,但為了邏輯清晰,需分別分析。爬蟲體系整體架構如圖2所示。

圖2 Scrapy框架下爬蟲體系架構
在Scrapy架構下,為保證爬蟲整體負載均衡[6],需要結合每個節點的權重制定爬蟲策略。影響負載均衡的因素較多,但最主要的是對采集速度的影響,因此,將節點一定時間內執行的任務數量作為判斷節點性能的指標。
如果某節點在t分鐘內執行了n個抓取任務,則此爬蟲節點在的采集速度表示為

(1)
式中,隨t與n值的增大,該比值會更加平穩,此時采集速度的變化將不能通過公式表達。為此,引入滑動窗口概念,僅統計近k分鐘內的抓取任務數量。假設ni表示近i分鐘的抓取任務數量,則權值表達式如下

(2)
實際爬蟲過程中,調度器分發的速度非常快,在分發任務時,需要設定任務分發量閾值,當超出該值后不再分發。這不僅可以確保任何節點時刻均為工作狀態,還能使調度器結合采集速度進行相應的任務調整。
2.3.1 蟻群優化算法的重要因素確定
本文使用蟻群優化算法在Scrapy架構的基礎上實現數據采集,此方法借鑒了螞蟻覓食過程,屬于一種全局尋優算法,算法本質是利用蟻群獲取優化問題的最佳解,同時產生一定信息素[7]。在多次優化操作中,螞蟻會找出最佳路徑,即最優解。在蟻群算法中路徑構建、信息素更新與目標解的選擇是影響算法性能的主要因素。
1)路徑構建
針對智能體K,如果在t時間點時,其所處網頁是Pi,若Pi中存在某鏈接指向網頁Pj,則位于Pi的蟻群將結合某條件判斷是否由Pi運動至Pj。假定Pi內全部鏈接指向的新網頁集合表示為V,使用偽隨機比例相關規則獲取智能體K由當前頁面Pi跳轉到Pj的幾率,偽隨機規則表達式為

(3)

2)信息素實時更新
在蟻群優化過程中,智能體在每個周期內都會更新全部路徑中的信息素,每條路徑中的信息素濃度也會逐漸降低。由網頁Pi到Pj的鏈接l(i,j)中的信息素更新表達式為

(4)

3)目標解選取
針對蟻群優化方法得到的每組p個最佳鏈接,通過快速非支配排列方式與最近最遠候選解方法,挑選出q(q≤p)個鏈接添加在集合中,引導爬蟲方向。計算某兩個解XS與XY的目標函數距離[10]

(5)
式中,Fi(XS)與Fi(XY)分別代表XS、XY的第i個目標函數值。
本文使用一個隊列CQ保存全部非支配解,再通過最近最遠候選解算法從CQ中挑選一組鏈接,將其指向的頁面當作下個周期的原始爬取節點。
2.3.2 爬蟲策略設計
1)主題相似度計算
在基于蟻群優化的爬蟲策略制定過程中,假設有M個螞蟻,每只螞蟻從當前頁面鏈接中挑選下一階段爬行網頁,同時將現處頁面中全部鏈接保存到等待隊伍中。針對新加入的鏈接,需計算主題相關度,計算方法如下。
鏈接指向頁面中的信息一般與鏈接所處頁面的信息具有相關性,前者是后者的相關說明。所以鏈接指向頁面與所處頁面之間的主題相關度,就是評價該鏈接是否和采集內容相關的重要標準。針對鏈接l指向頁面Pu,利用下述公式描述文本特征向量
U={u1,u2,…,ui,…,un}
(6)
則文本特征權值向量的計算公式如下
Wu=(wu1,wu2,…,wuj,…,wun)
(7)
式中,wuj代表第j個主題詞在Pu中的權值。
鏈接l指向的頁面具有的主題相關度表示為
R(Pu)=Sem(T,U)
(8)
綜上所述,獲取鏈接主題的相似度表達式
R(l)=h1×R(al)+h2×R(Pl)+h3×R(Pu)
(9)
式中,h1、h2與h3代表鏈接本身、鏈接所處網頁以及指向網頁的主題相關度權值系數,符合h1+h2+h3=1的要求。R(Pl)代表l所處網頁具有的主題相似度。
如果計算出的主題相似度高于設定閾值η,將此鏈接指向的頁面保存到集合中。反復操作上述過程,直至所有智能體均獲得最大爬行深度,再利用式(4)實現信息素濃度更新。
2)重合度計算
為避免重復數據采集,需計算數據的重合度。概念C1與C2二者重合度可通過它們的公共祖先節點描述,C1與C2重合度影響因子IFCoi表示為

(10)
式中,count(Up(C1)∩(Up(C2)))表示C1與C2公共節點數量,max(Depth(C1),Depth(C2))則代表C1與C2的層次深度極大值。IFCoi值越大說明二者重合度越高,在爬蟲過程中需要舍棄一個節點,這樣能夠有效避免采集到重復數據。
3)爬蟲數據采集步驟
因此,利用蟻群優化算法實現網絡爬蟲數據采集的詳細過程表示為:
步驟一:建立本體領域,確定數據采集主體,選擇適量種子鏈接,添加到初始鏈接隊列中,對參數α與β做初始化處理,設定相關閾值η。
步驟二:初始化處理所有鏈接的信息素濃度C0,令智能體執行爬蟲任務,獲得智能體K在現階段頁面Pi上的全部子鏈接,同時做過濾處理,將處理后的子鏈接保存到新的集合中;獲取Pi中主體相似度。

步驟四:如果l的主題相似度高于η,將l所指網頁PK添加到等待鏈接結合中,若PK相似度大于η,則保存在網頁集合中,反之刪除l。
步驟五:如果爬行深度已經是最大深度,則需清空禁忌表與初始鏈接隊列,執行下一步驟,反之返回步驟三。
步驟六:根據式(4)更新全部路徑中的信息素濃度,直到信息素濃度無法指明爬取方向為止,算法結束,完成數據采集。
仿真中,最重要的硬件設備是主節點服務器,該服務器直接影響實驗效果。為此,本文使用的服務器配置如下:內存為32GB,硬盤是250GB,帶寬頻率設置成10MB/S。
1)爬準率與爬全率測試
爬準率與爬全率是衡量網絡爬蟲算法性能的常用指標。其中前者是爬蟲爬取到和需采集內容有關的數據數量占比情況,后者則為爬蟲爬取到和需采集內容有關的數據量,占全網絡中和該采集內容有關的數據量之比。計算公式分別如下

(11)

(12)
式中,N代表爬取到和采集內容有關的數據量,W表示網絡中和該采集內容有關的數據數量,G是爬取到的總信息量。
為凸顯本文方法性能,將測試結果與網頁空間進化爬蟲策略、深度優先爬蟲算法進行對比,兩個評價指標的對比結果分別如圖3和4所示。

圖3 不同方法爬準率對比圖

圖4 不同方法爬全率對比圖
由圖3和4可知,本文方法始終保持95%以上的爬準率,沒有出現隨數據量增多爬準率下降的表征;在爬全率對比圖中,所提方法隨數據量增加出現并不顯著的下降趨勢,其它方法下降程度明顯。這是因為本文方法能夠準確計算出網頁與采集內容之間的相關度,提高爬蟲爬行準確性,同時計算了每個節點權重,結合權重信息執行爬行任務,保證了爬取的全面性。
2)去重效果測試
圖5為不同方法的去重效果對比結果。

圖5 不同方法去重效果對比圖
圖5顯示,三種算法隨采集數據量的增多,采集到的重復數據均有所增加。但所提爬蟲算法是建立在Scrapy架構下的,其中心引擎模塊會對數據進行分析,有效刪除重復數據,也能避免對重復數據的誤判。
3)爬蟲速度測試
對于優秀的爬蟲算法而言,僅僅具備較高的爬行準確率還遠遠不夠,爬行速度是衡量算法好壞的又一重要標準。假設節點數量分別為5個和20個,在這三種情況下,上述算法的爬行速度分別如圖6和7所示。

圖6 節點數量為5個時爬蟲速度對比

圖7 節點數量為20時爬蟲速度對比
分析圖6和7得出,隨節點數量增加,爬蟲速度均有提高。且無論節點數量多少,爬行速度趨勢大致相同,在前8分鐘時爬蟲速度有不同程度起伏,8分鐘之后爬取速度逐漸平穩,表明三種方法的爬行穩定性較強。其中,Scrapy架構下的爬蟲算法通過蟻群方式合理設置爬行路徑,提高爬蟲速度,說明該方法能夠在較短時間內采集更多數據。
互聯網中的信息正以幾何倍數增長,用戶要想在網絡中采集到想要的信息十分困難。本文提出里Scrapy架構下的分布式網絡爬蟲數據采集方法。通過對Scrapy各模塊的設計,保證爬蟲任務有序進行,再采用多目標蟻群算法,設置爬蟲路徑,提高爬蟲效率。仿真從多角度驗證了該方法性能,不但提高數據采集的精準度,還能減少采集時間,避免重復采集。在未來研究中,可結合具體需求擴展功能,設置一套完整的爬蟲系統,使海量網絡信息更好地服務于用戶。