基於餘弦相似性的404頁面識別

  寫過爬蟲或者漏洞掃描器的朋友肯定遇到過一個問題,就是如何判斷一個url對應的頁面是個404頁面,因為這對之後的邏輯判斷尤為重要。然而由於存在一些特殊情況,導致404頁面判斷沒有想像中的那麼簡單,這往往跟伺服器配置有關。本篇作為《漫談漏洞掃描器的設計與開發》的一個分支文章,重點談談如何判斷一個頁面是否為404頁面。

404頁面

  一般情況下,判斷一個網頁是否為404頁面,主要看其返回的響應碼。若響應碼為404,則說明這是一個不存在的頁面,若不是則說明是一個存在的頁面。然而出於對用戶的友好,有些網站往往會優化404頁面,大致有以下幾種優化方式。

跳轉到指定頁面

  第一種優化方式是:一旦用戶訪問了一個不存在的頁面,伺服器會將請求跳轉到一個指定的url,往往是網站首頁,或者是網站登陸頁面。這種情況下,請求一個不存在的頁面的響應碼會從302變為200(服務端跳轉),或者響應碼直接為200(客戶端跳轉,用戶可感);網頁內容為網站首頁或者網站登陸頁面等指定頁面的內容。

例子:didichuxing.com/nmask

跳轉到優化後的404頁面

  第二種優化方式是:一旦用戶訪問了一個不存在的頁面,伺服器會將請求跳轉到404頁面,與第一種方式不同的是跳轉後的這個頁面確實是404頁面,但是是經過特殊處理優化的。這種情況下,請求一個不存在的頁面的響應碼會從302變為200(服務端跳轉),或者響應碼為200(客戶端跳轉),網頁內容為一個經過優化的404頁面內容。

例子:jd.com/nmask

直接顯示404頁面

  第三種方式是:一旦用戶訪問了一個不存在的頁面,頁面直接顯示為404頁面(伺服器默認)。這種情況下,請求一個不存在的頁面的響應碼可能是404(默認情況),也可能是200,頁面內容為默認404或者處理後的404頁面。

例子:alibaba.com/nmask

總結404頁面的特徵

  綜上所訴,一個404頁面的響應碼可能為:404,302,200(當然不排除有其他情況);一個404頁面的頁面內容可能是:網站首頁內容(指定頁面)、優化後的404頁面內容、伺服器默認的404頁面內容。

如何科學的判斷一個404頁面?

綜上所訴,我們大致可以得到這樣的判斷邏輯:(偽代碼如下)

if 響應碼 == 404: return this_is_404_pageelif 目標網頁內容 網站404頁面內容 相似: return this_is_404_pageelse: return this_is_not_404_page

  但要通過以上的邏輯判斷,需要解決兩個問題。問題一:如何提前收集網站的404頁面內容;問題二:如何判斷目標網頁內容與網站404頁面內容是否相似。

  先解決下問題一,這個比較好解決,我們可以構造一些不存在的路徑(比如:/this_is_a_404_nmask_page),請求獲取頁面內容。

  第二個問題比較麻煩,首先我們需要注意這裡指的是網頁相似而非相同。為何這裡不直接判斷是否相同呢?因為一些404頁面內容包含隨機因子,比如當前時間,或者頁面包含一些推廣的信息,導致每個404頁面內容都有差異。因此如何判斷目標網頁內容與網站404頁面內容是否相似,而非相同,才是識別一個網頁是否為404頁面的科學方法。

  那麼該如何判斷2個網頁是否相似呢?這裡借鑒了判斷文章相似性的演算法—餘弦相似性演算法。那麼什麼叫餘弦相似性演算法,它又怎麼用於判斷網頁相似性呢?請往下看。

餘弦相似性演算法介紹

假設我們有需求:判斷兩篇文章是否相似?

實現方案:

(1)使用TF-IDF演算法,找出兩篇文章的關鍵詞;

(2)每篇文章各取出若干個關鍵詞(比如20個),合併成一個集合,計算每篇文章對於這個集合中的詞的詞頻(為了避免文章長度的差異,可以使用相對詞頻);

(3)生成兩篇文章各自的詞頻向量;

(4)計算兩個向量的餘弦相似度,值越大就表示越相似。

具體例子:

句子A:我/喜歡/看/電視,不/喜歡/看/電影。

句子B:我/不/喜歡/看/電視,也/不/喜歡/看/電影。

得出所有分詞為:我,喜歡,看,電視,電影,不,也。

計算詞頻:(出現的次數)

句子A:我 1,喜歡 2,看 2,電視 1,電影 1,不 1,也 0。

句子B:我 1,喜歡 2,看 2,電視 1,電影 1,不 2,也 1。

計算詞頻向量:

句子A:[1, 2, 2, 1, 1, 1, 0]

句子B:[1, 2, 2, 1, 1, 2, 1]

我們可以把它們想像成空間中的兩條線段,我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。

計算公式:

計算結果:

說明:餘弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫」餘弦相似性」。

基於餘弦相似性演算法的網頁相似性判斷方法

下面列舉了餘弦相似性演算法與漢明距離演算法,測試發現對於判斷網頁相似性餘弦相似性演算法準確率更高一些。

一)網頁標籤相似性(篩選出網頁所有標籤,只選標籤名稱) 先計算出兩個網頁所有標籤的向量: A:(a,b,c,d,e,f,g,a,b,c) B:(a,c,b,d,e,f,g,a,c) 1)計算A與B的漢明距離: a,b,c,d,e,f,g,a,b,c a,c,b,d,e,f,g,a,c —————————————————— 0 1 1 0 0 0 0 0 1 1 A與B的漢明距離為 1+1+1+1=4,相似度為:(10-4)/10=60% 2)計算A與B的餘弦相似性: A: a 2 b 2 c 2 d 1 e 1 f 1 g 1 B: a 2 b 1 c 2 d 1 e 1 f 1 g 1 繼續簡化: A: [2,2,2,1,1,1,1] B: [2,1,2,1,1,1,1] 餘弦相似性: 2*2+2*1+2*2+1*1+1*1+1*1+1*1 ------------------------------------------------------------------------------ ((2^2+2^2+2^2+1^2+1^2+1^2+1^2) ** 0.5) * ((2^2+1^2+2^2+1^2+1^2+1^2+1^2) ** 0.5) 14 = ------------- 4 * (13**0.5) = 0.97 即相似性為97%二)網頁文本相似性計算與標籤判斷演算法一樣,只是需要篩選出網頁文本,並進行分詞

說明:漢明距離更注重順序相似,比如一個網頁的標籤排序順序是否相似;而餘弦相似性更關注整體標籤的個數關係,對順序不敏感。漢明距離可以看成是點與點間的距離,餘弦相似性可以看成是線與線之間的夾角或者說距離。

更加嚴謹的科學判斷

  通過餘弦相似性演算法,我們大致可以計算出兩個網頁的相似度。那麼看似以上邏輯判斷應該就可以判斷出404頁面了。然而實際情況還要更複雜些,比如如何設置相似度的閥值,還需要大量的打標數據去計算。再比如如何降低一些特殊url帶來的誤報。這裡特殊的url包含網站首頁、登陸頁面等,因為當訪問一些404頁面時,可能會跳轉到此頁面上,導致網頁相似性計算結果很接近。這些問題的解決方案這裡就不介紹了。

判斷404頁面的測試介面

基於以上理論,我自己部署了一個判斷404頁面的api介面,可供大家測試一下準確性。

api介面地址:api.nmask.cn/not_exist_

若遇到判斷錯誤的url,可在下方留言,或者郵件:tzc@maskghost.com。

本文內容來自個人博客:基於餘弦相似性的404頁面識別,轉載請說明出處!

更多內容可關注個人公眾號:

weixin.qq.com/r/AD-v97f (二維碼自動識別)


推薦閱讀:

爬蟲 get 請求返回的內容是byte類型,如何轉為漢字?在線等
用Python爬取網易雲音樂歌曲
拉勾網_數據分析師崗位:Python爬蟲
八、示例
urllib庫使用詳解

TAG:python爬蟲 | 信息安全 | 漏洞挖掘 |