劉洋
(四川大學計算機學院,成都610065)
爬蟲是一種按照特定規則在互聯網上獲取信息的程序。在大數據的背景下,每一家公司都希望在提供互聯網服務的同時保護自己的數據,防止信息被網絡爬蟲的竊取。根據Distil Networks 發布的“2018 Bad Bot Report”[1],在2017 年,全部互聯網流量中有42.2%來自于爬蟲程序,而不是真實的用戶。在這些爬蟲中有21.8%屬于不遵守爬蟲協議的惡意爬蟲,惡意爬蟲的肆掠不僅會導致目標網站訪問速度變慢甚至無法訪問,而且會導致網站用戶隱私信息、公司商業數據泄漏,造成持續的經濟損失。所以,能夠阻擋爬取行為的反爬蟲方法對于商業服務網站來說尤為重要。
現存的反爬蟲方法主要可以分為兩類,第一類會依據各種輔助信息主動識別網絡爬蟲,然后拒絕提供服務,或者返回無關的垃圾信息使其失效[2];第二類反爬蟲方法不主動識別網絡爬蟲,而是利用各種復雜的前端數據渲染技術來增加網絡爬蟲的爬取難度。
用戶通過HTTP 向網站發出請求,網站可以通過HTTP Request Header 獲取發送請求的終端信息、發送請求的來源頁面鏈接、用戶的登錄信息以及用戶的IP地址[3]。通過埋點技術,網站還可以獲取用戶的鼠標的點擊事件、窗口縮放事件、請求頻率等信息。網站可以借助這些信息,判斷一個請求的發起者是不是一個真實的用戶,進而采取相應的應對措施。這種方法的優點是簡單、對網站的改動小;但是也存在嚴重的缺陷,網絡爬蟲可以通過偽造HTTP Request Header 內容,輕松地繞過網站的檢測。另外,新浪新聞網站采用了異步數據加載的方法渲染前端數據來防止網絡爬蟲直接獲取頁面靜態數據。還有一些網站,例如美團網、貓眼電影網會對傳輸數據進行加密,然后在前端利用自定義的字符映射關系表將數據解碼后顯示出來[4]。這種方法的缺陷是需要對網站進行較大的改動,且不易維護。并且隨著OCR(光學字符識別)技術的成熟,網絡爬蟲可以準確地識別網頁截圖中的文字內容,使這種反爬蟲方法失效。
用戶在瀏覽網頁的過程中產生的行為數據信息統稱為網頁瀏覽行為,他們共同刻畫了用戶的行為特點、網頁瀏覽習慣以及偏好[5]。所以,我們選擇了部分瀏覽行為作為特征來幫助識別網絡爬蟲。表1 展示了本文所使用的9 種網頁瀏覽行為特征。接下來我們需要將具有連續值的特征進行標準化,以便于后續決策樹的構造。
●特征是離散值,且取值劃分大于2,那么用該特征的每一個劃分作為一個子分類;
●特征是離散值,且取值劃分數為2,那么用“符合此特征”和“不符合此特征”分為兩個子分類;
●特征是連續值,那么取分裂點division_point,將其劃分為兩個子分類:feature >division_point和 feature ≤division_point。

表1 網頁瀏覽行為特征
(1)A 站內訪問活躍度:該特征描述了某個用戶在一段時間內平均發起的站內請求數量A1,站內請求的平均時間間隔A2。如果(其中是相同時間段內所有真實用戶的站內請求數量的均值),那么該用戶就更有可能是網絡爬蟲;如果(其中是相同時間段內所有真實用戶發起的站內請求的平均時間間隔),那么該用戶就更有可能是網絡爬蟲。
(2)O 站外訪問:該特征描述了用戶在網站中瀏覽時是否會通過點擊站外鏈接。通常網絡爬蟲會爬取指定域名下的網頁,所以如果用戶沒有點擊站外鏈接,O=1;否則O=-1。
(3)C 訪問內容豐富度:該特征描述了用戶點擊元素類型的數量C1,以及用戶點擊元素類型的分布C2。由于網絡爬蟲訪問的頁面元素類型比較集中,如果(其中是所有真實用戶點擊的頁面元素類型的數量平均值),那么表示該用戶只點擊頁面中固定的幾種元素,可能是網絡爬蟲;如果點擊元素類型的分布向量C2與所有真實用戶點擊元素類型的分布向量的距離大于閾值,那么表示該用戶對某些網頁元素的點擊頻率高于均值,可能被識別為爬蟲。
(4)P 訪問頁面豐富度:該特征描述了用戶在瀏覽的頁面種類P1,以及訪問的頁面種類分布向量P2。網絡爬蟲具有明確的目標,所以訪問的頁面比較固定,相應地頁面豐富度較低。
(5)T 訪問頁面軌跡:該特征描述了用戶在瀏覽一個網站時的訪問順序,使用向量 T 表示(T={t1, t2,t3,…tn}),其中ti表示第i 個頁面訪問序列。假設網站的所有合法頁面的訪問軌跡集合為:,那么當?t ∈T,t ?T',該用戶就可能是網絡爬蟲。
(6)t 點擊間隔時間:該特征描述了用戶的兩次點擊的間隔時間。假設所有真實用戶的點擊時間間隔平均值為t',如果用戶的點擊間隔時間明顯低于真實用戶的平均點擊時間間隔(t'-t >μ),那么該用戶就可能是網絡爬蟲。
(7)R 不同資源類型請求分布:網站的資源通常可以分為靜態資源和動態資源兩類,該特征描述了用戶請求HTML、文本、圖片、CSS、JS 等不同資源類型的數量分布。如果請求資源類型的分布向量R 與所有真實用戶請求的資源類型分布向量R'的距離大于閾值γ(R?R'>γ),那么表示該用戶對某些資源類型的訪問頻率高于均值,可能被識別為爬蟲。
(8)s 頁面滾動:該特征表示用戶在瀏覽單個頁面時鼠標向下滾動的次數s1,以及向上滾動的次數s2。用戶在瀏覽網頁的過程中,需要上下滾動鼠標查看網頁的所有內容。而網絡爬蟲直接對網站代碼進行解析不會產生滾動動作,雖然使用Selenium 和PhontomJs技術的網絡爬蟲也會產生滾動行為,但是和真實用戶相比,鼠標向下滾動的次數會大幅超過鼠標向上滾動的次數。
(10)TP 頁面停留時間:用戶在瀏覽網頁的過程中,需要駐留一段時間瀏覽內容再決定訪問下一個頁面或者選擇離開網站。該特征表示用戶從打開單個頁面到離開該頁面的時間差。如果用戶單個頁面停留時間小于最小正常時間(TP<θ),那么該用戶可能被識別為爬蟲。
決策樹(Decision Tree)是以類別為葉節點,屬性為分支節點的一棵二叉樹或多叉樹[6]。在決策樹中,每一個分支節點表示一個特征的劃分,而每個分支對應這個特征的值域分布,即表示對象所屬分類的預測結果。從根節點到葉子節點的路徑就是一條分類規則,分類的過程簡單直觀,方便人類專家進行檢驗[7]。
決策樹的構造的關鍵是對特征進行篩選,選擇合適的特征度量將對象劃分成不同的類,而構造的目標是讓決策樹的每一個待分類分支盡可能地屬于同一個類別。那么我們每次都應該選擇信息增益最大的特征進行劃分操作。假設D 是樣本數據集,樣本數量為:n,其中包括兩種類別的數據(真實用戶類別樣本數:n1、網絡爬蟲類別樣本數:n2),那么劃分前的信息熵計算公式如公式(1)所示:

然后我們使用特征Feature 對樣本D 進行劃分,那么Feature 作用后的信息熵的計算公式如公式(2)所示。其中,k 為樣本D 劃分后的k 個子類;Di表示第i個子分類下的樣本數量。而信息增益的計算就是兩者的差值,如公式(3)所示:

最后,我們依次選擇信息增益最大的特征構造決策樹。為了避免決策樹對樣本數據過擬合的現象,我們將樣本數據集D 分為三部分(訓練集D1占二分之一,驗證集D2占四分之一,驗證集D3占四分之一)。在劃分的過程中,每次劃分前,使用驗證集D2來驗證Feature 能否提高決策樹的分類準確度。如果分類準確度提高,就把Feature 加入決策樹作為分支節點;否則此次劃分失敗。最后使用驗證集D3對決策樹進行考察,自底向上依次刪除非葉子節點。如果將該子樹替換成葉節點能夠提高分類準確度,那么執行該刪除操作,否則保留該節點。
本文提出一種基于網頁瀏覽行為的反爬蟲方法,它通過提取真實用戶和網絡爬蟲瀏覽網頁時產生的行為特征構造決策樹,最后使用決策樹對一個用戶是否屬于爬蟲進行預測。該方法屬于第一類的反爬蟲方法,和同類的其他方法相比具有更高的真陽率,更低的假陰率;和第二類的反爬蟲機制相比,該方法簡便易實施,并且對網站的改動小,并且針對網絡爬蟲的敏感性高,假陰率較低。然而在少數情況下,使用該方法仍可能將網絡爬蟲判斷為真實用戶,主要是因為選擇的網頁瀏覽行為特征不夠充足。接下來,我們希望能夠提取更多有效的網頁瀏覽行為特征,來杜絕假陰性。