k 近鄰算法解決字體反爬手段|效果很是好

字體反爬,是一種利用 CSS 特性和瀏覽器渲染規則實現的反爬蟲手段。其高明之處在於,就算藉助(Selenium 套件、Puppeteer 和 Splash)等渲染工具也沒法拿到真實的文字內容。python

這種反爬蟲手段一般被用來保護頁面中的關鍵數據,例如影片票房、外賣平臺的商家電話、汽車門戶上的車型報價或者是電商平臺上商品的屬性和價格。算法

關於字體反爬蟲的介紹、實現和原理能夠參考書籍《Python3 反爬蟲原理與繞過實戰》,也能夠經過搜索引擎查找資料,本篇文章再也不贅述。瀏覽器

本篇文章要解決的問題,是如何讓程序準確的識別那些用自定義字體代替的文字微信

本文將圍繞網站 aHR0cHM6Ly9tYW95YW4uY29tL2ZpbG1zLzEyMTgwMjk= 進行討論,具體目標以下圖:機器學習

顯然,頁面中的用戶評分、累計票房等內容是關鍵數據,它們也正是爬蟲工程師們想要的東西。雖然人類的眼睛看到的是 9.414.05,但在瀏覽器開發者工具中它們倒是 ..9.4 對應的 HTML 代碼爲:編輯器

<span class="stonefont">.</span>

而網頁源代碼中,倒是另一番景象:工具

<span class="stonefont">&#xe761;.&#xe8d6;</span>

有經驗的朋友一眼就看出來了,這是字體反爬蟲的手段!沒有經驗的朋友,請去閱讀《Python3 反爬蟲原理與繞過實戰》。post

這種字體反爬蟲的破解思路爲:學習

獲取相關 CSS 文件中 ttf 或 woff 字體文件,經過 python 的 fontTools 模塊創建字體對應關係。測試

可是當你分析本文給出的案例時,卻發現頁面使用的字體是實時動態變化的,沒法創建肯定的對應關係。這跟Python3 反爬蟲原理與繞過實戰》中提到的反爬蟲思路很類似,很棘手!

但慶幸的是,遇到的字體反爬手段和《Python3 反爬蟲原理與繞過實戰》中介紹的不是徹底相同的,有些手段並無用上,還好還好。

接下來,將介紹基於深度學習中最簡單的K-近鄰算法來破解這種實時動態變化的字體反爬措施。先說一下破解的步驟:

  • 將頁面用到的字體文件下載到本地
  • 經過字體編輯器查看該字體文件
  • 觀察字體文件隨機動態的現象,並記錄變化規律
  • 得出變化規律的規則

以本文給出的案例網站爲例,首先在瀏覽器開發者工具的 NetWork 一欄找到頁面加載的字體文件(一般是 WOFF 格式),並將問價下載到本地。而後用字體編輯器(例如百度字體編輯器)查看字體文件,以下圖:

接着用 fontTools 庫將 WOFF 格式的文件轉換爲 XML,並查看座標變化規律。例如數字 6 對應的特殊字符爲 uniF5DE,其對應的座標值以下:

另外一個字體文件中,數字 6 對應的座標值以下:

通過屢次測試發現:同一數字的對象雖然不一樣,可是區別甚微,對象中每一個座標的差值較小。這樣咱們能夠經過限定對象的座標值差值在必定範圍內就能夠認爲是兩個相同的數字了。

接下來採用機器學習最簡單的方法KNN算法通過簡單的訓練,便可將座標分類。

那麼什麼是KNN算法呢?

簡單的說,K-近鄰算法採用策略不一樣特徵值之間的距離方法進行分類。

工做原理

存在一個樣本數據集合,也稱做訓練樣本集,而且樣本集中每一個數據都存在標籤,即咱們知道樣本集中每一數據與所屬分類的對應關係。輸入沒有標籤的新數據後,將新數據的每一個特徵與樣本集中數據對應的特徵進行比較,而後算法提取樣本集中特徵最類似數據(最近鄰)的分類標籤。通常來講,咱們只選擇樣本數據集中前k個最類似的數據,這就是k-近鄰算法中 k 的出處,一般k是不大於20的整數。最後,選擇 k 個最類似數據中出現次數最多的分類做爲新數據的分類。

基於上述介紹,能夠先製做一個樣本數據集合,樣本數據集合以下:

即從 XML 文件中提取相關數字的座標。經過 KNN 算法,對輸入的字體的座標進行計算,標記其標籤:

def classifyPerson(font):
		# 完整代碼將在文末得到
		pass

經過 KNN 算法標記標籤後,便可經過 replace 方法對源代碼文件進行替換:

fonts = {}
for i in base_list:
		# 完整代碼將在文末得到

這裏隨意選取了多個目標地址,並驗證了其正確輸出,本文案例對應的數據以下:

{"電影名稱": "少年的你", "用戶評分": "9.4", "評分人數": "95.2 萬", "累計票房": "7.32 億"}

至此,字體反爬的問題就解決了。

更多關於字體反爬的思路和研究請翻閱《Python3 反爬蟲原理與繞過實戰》,本文中還有一些重要觀點未說起,建議翻書補齊知識。

完整代碼請關注微信公衆號爬蟲工程師之家,並回復 20191029,便可得到代碼倉庫的連接。

本文參考:

公衆號爬蟲工程師之家的文章《基於K-近鄰算法,破解CSS動態混淆字體》

韋世東的新書《Python3 反爬蟲原理與繞過實戰》


做者:華爲雲享專家 夜幕韋世東

相關文章
相關標籤/搜索