黃志高
(泉州師范學院物理與信息工程學院,泉州 362000)
網絡爬蟲在各個領域用于收集數據,即使目標站點禁止機器人爬蟲,某些網絡爬蟲也會收集數據,某些Web 服務嘗試通過反爬蟲程序方法檢測爬蟲活動并阻止爬蟲程序訪問網頁,但某些惡意Web 爬蟲通過修改其標頭值或分發源IP 地址來偽裝自己[1],從而繞過檢測方法,就好像它們是普通用戶一樣。
一些公司禁止網絡爬蟲訪問他們的網頁,原因如下:首先,網絡爬蟲可能會降低網絡服務器的可用性;其次,網絡服務器中的內容被視為公司的知識產權。競爭公司可以復制網絡服務器中提供的全部數據,競爭公司可能會向客戶提供類似的服務。本文研究了傳統的反爬蟲方法和各種回避技術,表明傳統的反爬蟲方法不能阻止分布式爬蟲。然后,提出了一種新的反爬蟲方法,即長尾閾值模型(LTM)方法,該方法逐漸將分布式爬蟲的節點IP 地址添加到阻止列表中。實驗結果表明,該方法能夠有效識別誤報率為0.02%的分布式爬蟲。在傳統的基于頻率的方法中[2],當增加閾值以檢測更多的爬蟲節點時,誤報也會相應增加。
基本爬蟲程序發送請求而不修改其標頭信息,Web 服務器可以通過檢查請求標頭來區分合法用戶和爬蟲程序,此標頭檢查方法是一種基本的反爬蟲方法。但是,如果爬蟲試圖將自己偽裝成合法用戶,它將使用來自Web 瀏覽器的標頭信息或類似于瀏覽器的HTTP 標頭信息重置[3]。這使得Web 服務器很難通過簡單地檢查請求標頭來確定客戶端是爬蟲程序還是合法用戶。
基于訪問模式的反爬蟲方法根據客戶端生成的請求模式將合法用戶與爬蟲程序進行分類。如果客戶端僅連續請求特定網頁,而不調用通常應請求的網頁,則該客戶端將被視為爬蟲程序。執行主動爬蟲的爬蟲程序預定義了爬蟲程序想要收集的核心網頁,爬蟲程序請求特定的網頁而不請求不必要的網頁。在這種情況下,Web 服務器可以識別客戶端不是合法用戶。通過分析客戶端訪問模式的Web 服務,該服務可以根據預定義的普通用戶的訪問模式將爬蟲程序與普通用戶區分開來。雖然這種方法可以根據訪問模式識別爬蟲,但一些爬蟲甚至通過分析網絡日志來偽裝他們的訪問模式。
基于訪問頻率的反爬蟲方法通過訪問頻率閾值作為特定時間范圍內的最大訪問次數來確定客戶端是爬蟲還是合法用戶。如果來自客戶端的請求數在預定義的持續時間內超過某個閾值,則Web 服務器會將客戶端分類為爬蟲程序。這種方法有兩個眾所周知的問題。首先,它對分布式爬蟲有漏洞。如果攻擊者使用分布式爬蟲(如Crawlera),則可以管理每個爬蟲節點的訪問速率保持在閾值以下[4]。其次,普通用戶和爬蟲程序共享單個公共IP 地址,容易被誤識別為爬蟲程序。
如上所述,分布式爬蟲程序可以繞過傳統的反爬蟲方法。我們提出了一種新技術來檢測和阻止傳統反爬蟲技術無法防御的分布式爬蟲。
為了使分布式爬蟲收集網站的全部數據,必須滿足以下條件:
其中:Um是一個月內更新的項目數,Td是每個IP 地址的最大請求數,Cn是爬蟲程序節點數(IP 地址),30 是一個月的天數。Td乘以 30 得到每月的請求數。
爬蟲程序節點需要收集每月所有更新的數據。每月更新數據數除以每月最大請求數。例如,如果一個月內有Web 服務更新30000 個項目,并且該服務具有限制規則,即具有多個(例如100)請求的IP 地址將被阻止,并且嘗試從Web 服務收集每個項目的攻擊者將需要例如10個爬蟲程序節點來避免限制。因此,隨著Um增加或Td減少,應該增加Cn并以數字表示網站難以抓取的級別。
一個月內更新的項目數量不能隨意增加。因此,防止分布式爬蟲的一種簡單方法是Td減少,但這也會顯著增加誤報。在本文中,我們通過反轉Web 流量的一般特征并利用分布式爬蟲嘗試復制Web 服務器的整個數據的事實來解決這個問題。如果項目按訪問率排序,我們可以在圖表中看到指數遞減曲線,如圖1 所示。大多數網絡流量集中在最常請求的項目上,并且有一個長尾區域具有較低的訪問率。我們計算了此長尾區域的最大請求計數,并將此值設置為Td3。

圖1 每個鏈接的訪問頻率
在信息論中,不太可能的事件比可能的事件更具信息量,而長尾地區的事件比其他事件更不可能。這意味著Web 服務可以從長尾區域的請求中查找更多信息。因此,當客戶端不斷請求長尾區域中的項目時,Web 服務可以增加計數,直到達到Td3,而不是達到Td平均值。這意味著Web 服務可以設置更敏感的閾值,而不會增加誤報率。
為了使攻擊者從Web 服務收集整個數據,攻擊者還必須訪問長尾區域中的項目。但是,攻擊者并不確切知道哪些項目屬于長尾區域。利用這種信息不對稱性,服務提供商可以輕松識別比其他IP 地址更頻繁地訪問項目的IP 地址。這些已識別的爬蟲程序的IP 地址將包含在阻止列表中,并且阻止列表中的IP 地址數將為Cm。如果我們開始通過長尾間隔增加該Cm值,攻擊者將使用較少數量的IP 地址進行爬行,并且會在Td間隔內增加Cm[5]。
服務提供商可能會添加虛擬項目來檢測爬蟲程序,并且合法用戶無法訪問虛擬項目,因為虛擬項目沒有用戶界面或隱藏。生成虛擬項目的方法很少,它可能以HTML 標簽的形式存在,但屬性設置不會顯示在屏幕上,或者可能包含普通用戶不感興趣的垃圾信息。但是,對服務執行順序訪問的爬蟲程序可能會訪問虛擬項目。通過這一特性,虛擬項目可以作為長尾區域的延伸。在本文中,我們不會在實驗中包含虛擬項目,以便與不包含任何虛擬項目的真實流量日志進行公平比較[6]。
實驗旨在評估爬蟲檢測模塊對網絡流量的分類性能。將LTM 方法與基于正常訪問頻率的反爬蟲方法在爬蟲節點的最大數量和誤報率上進行了比較[7]。在實驗中使用這個數據集有兩個因素,一個是用戶數,另一個是網站中的項目數。用戶數量很重要,因為如果用戶數量較少,某些用戶可能會偏向流量模式。為了實現這一目標,我們開發了一個基于Python 的數據工具和一個模擬器。在數據預處理工具中,如圖2所示對原始流量數據進行預處理,以計算單個URL 的訪問頻率,并對屬于長尾區域的集進行分類。每當發生新的訪問時,模擬器根據預處理的數據確定訪問節點是否為爬蟲程序。

圖2 爬蟲檢測流程
NASA 在2005 年7月共公布了2493425份訪問日志。我們將這些日志解析為csv 格式,該格式由四列組成,包括IP 地址、日期、訪問目標和訪問結果。連接的IP 地址總數為41958,項目數為21534。
我們在實驗的預處理階段執行了三個步驟。第一步將日志拆分為兩個數據集:訓練集和測試集。在NASA 訪問日志中,前24 天日志設置為訓練集,最后一個日志設置為測試集。第二步篩選出一些訪問日志,以計算更準確的訪問計數。某些請求合并為單個請求,以防止重復計數。例如,當用戶訪問html 文件時,他們還可以訪問鏈接的圖像文件。這可能會強制訪問計數成倍增加。因此,我們刪除了一些對圖像文件的請求。此外,我們還從實驗中排除了訪問結果不成功的請求日志。

表1 預處理的網絡流量數據
實驗中構建了一個預處理的流量數據集,該數據集由來自21649 個原始數據的6649 個項目組成,并且它有一個由5355 個項目組成的長尾區域。總訪問數平均值為184.76,長尾區的平均訪問數為1.88。兩個平均值之間的差異只是表明可以在爬蟲檢測算法中設置一個更靈敏的閾值。
實驗還統計了按訪問頻率排序時最常訪問的鏈接,到最不常訪問的鏈接的特征[8]。比率是指按訪問計數對所有項目進行排序時每個組所在的間隔。訪問平均值是指屬于每個組的每個項目的平均訪問次數,最大訪問量是指每個組中項目之間的最大訪問計數。
在仿真實驗中,檢查LTM 是否能夠檢測和禁用分布式爬蟲程序IP 地址組,將實際Web 流量輸入到LTM 時檢查誤報率。整個爬蟲程序檢測流程如圖2所示。
從表2的實驗數據,我們可以觀察到爬蟲IP地址集合逐漸減少,直到所有IP 地址都被完全阻止。當第一個爬蟲節點IP 地址超過Td3閾值IP被封禁,節點減少計數呈指數級增長。這是因為其他爬蟲節點得到了更多的訪問負荷,并且當爬蟲節點被訪問時,更多的項目必須訪問被阻止。

表2 實驗數據
實驗閾值設置為20,爬蟲項目包含222 節點。LTM 檢測到了整個爬蟲項目所有節點,錯誤率約為0.0275%,遠低于傳統的基于頻率的爬蟲檢測方法。在表2 中,我們將LTM 的結果與通用的基于頻率的反爬蟲(FBA)方法的結果進行了比較。LTM 對分布式的爬蟲檢測性能非常依賴于項目的數量和長尾比率。考慮到這個限制,仿真實驗是使用舊的NASA 交通數據進行[9],項目的總數比通常的現代網絡項目要小得多。如果有10 倍數據和類似訪問的頻率分布的項目,我們提出的方法可以從由2000 個節點組成的網絡項目中檢測出分布式爬蟲。
在實驗中,LTM 達到了最小的錯誤率為0.0046%,而FBA 僅達到0.0367%,這意味著LTM 的檢測可靠性比經典FBA 方法提高了500%。當我們將閾值設置為35,這時LTM 達到最小誤報率的值,FBA 方法比LTM 方法多了19.400%的誤報率。
本文介紹了長尾閾值模型(LTM),并展示了LTM 如何有效地檢測分布式爬蟲,相比之下先前的方法是脆弱的。通過模擬真實的網絡流量數據,LTM 有效地識別了分布式爬蟲,并顯示出極低的誤報率。針對網絡服務的非法網絡爬取成為嚴重的安全威脅[10]。考慮到一些爬蟲開發者將分布式爬蟲代理服務用于非法目的,LTM 可以提高網絡服務的數據安全性。