字體反爬也就是自定義字體反爬,通過調用自定義的woff文件來渲染網頁中的文字,而網頁中的文字不再是文字,而是相應的字體編碼,通過復制或者簡單的采集是無法采集到編碼后的文字內容!
1.思路
近期在爬取天眼查某公司詳情頁遇到了字體反爬,經過多次測試,終於解決了字體反爬
首先我們來看一下字體反爬
此圖可以看出源代碼數字跟頁面顯示的內容是不一樣的,在調試器中看到它有一個類tyc-num
此圖可以看出類tyc-num存放的是一個字體,通過network獲取這個字體
此圖可以看出正常的字體數字是1234567890而現在顯示的是7540129863它是順序打亂的,把tyc-num.woff下載過來,下載過來之后發現windows是查看不了的,我用的是在線工具查看
在線工具鏈接:FontEditor
此圖可以發現索引2對應的是4,說明第4個數字是0,通過Python對woff轉換成xml
from fontTools.ttLib import TTFont font = TTFont('tyc-num.woff') font.saveXML('tyc-num.xml')
查看xml文件
此圖發現id2對應是4跟在線查看器是一樣的,那就找到了對應關系
2.代碼實現
安裝 fontTools
pip install fontTools
上代碼(代碼更新2019-01-21|19:23:16) PS:發現某些公司時間還是對不上,代碼更新了,上面思路是一樣的
#!/usr/bin/env python # -*- coding:utf-8 -*- from fontTools.ttLib import TTFont import re font = TTFont('tyc-num.woff') # 打開tyc-num.woff font.saveXML('tyc-num.xml') # 保存為tyc-num.xml with open('tyc-num.xml', 'r') as f: xml = f.read() # 讀取tyc-num.xml賦值給xml GlyphID = re.findall(r'<GlyphID id="(.*?)" name="(\d+)"/>', xml) # 獲得對應關系 GlyphIDNameLists = list(set([int(Gname) for Gid, Gname in GlyphID])) # 對應關系數量轉換 # print(GlyphIDNameLists) DigitalDicts = {str(i): str(GlyphIDNameLists[i - 2]) for i in range(2, len(GlyphIDNameLists)+2)} # 數字對應關系的字典推導式 # print(DigitalDicts) GlyphIDDicts = {str(Gname): DigitalDicts[Gid] for Gid, Gname in GlyphID} # 通過數字對應關系生成源代碼跟頁面顯示的字典推導式 print('-' * 39 + '數字對應關系的字典推導式' + '-' * 39) print(DigitalDicts) print('-' * 27 + '通過數字對應關系生成源代碼跟頁面顯示的字典推導式' + '-' * 27) print(GlyphIDDicts)
代碼運行結果