天天看點

glidedsky挑戰-字型反爬2

為了避免某某官方網站,本次記錄同樣也是 "glidedsky" 網站中的反爬蟲題目,隻要明白,其它網站理論都差不一樣。

相關網站:http://glidedsky.com/level/web/crawler-font-puzzle-2

網站截圖

glidedsky挑戰-字型反爬2

打開頁面是這樣的

glidedsky挑戰-字型反爬2

頁面h5參數是這樣的

glidedsky挑戰-字型反爬2

蒙蔽中。。。

探究過程:

這個跟我們需要的0-9個阿拉伯數字有什麼關系?

沒辦法了,找與中文漢字相關的資訊吧。

找個這個資訊:

glidedsky挑戰-字型反爬2

字型的樣式。那就開始找對應的css樣式,看看到底是什麼

于是找到了這個:

glidedsky挑戰-字型反爬2

可以看到,這是一個字型資料。使用的base64編碼。

這時我們就把很長的一段資料,通過解碼,寫入到檔案,看看裡面,到底是什麼。

# 擷取字型資料
ttf_str = re.search(r'base64,(.*?)\) format',woff_str).group(1)
 # 将字型資料儲存到本地
with open('font2.ttf', 'wb',) as fw:
    fw.write(base64.b64decode(ttf_str))
           

使用High-Logic FontCreator工具打開font.ttf檔案看看裡面是什麼字型格式

glidedsky挑戰-字型反爬2

打開,再和網頁中顯示對比一下,0-9果然一緻。

那麼肯定是通過一定的關系映射到頁面中的。

檢視關聯關系:

glidedsky挑戰-字型反爬2

看看這三個是否有關系:

把字型中的編碼取出來。解析一下,

glidedsky挑戰-字型反爬2

果不其然。

到這裡可以明白,這個映射關系是:

頁面中的中文字的編碼,就是對應字型集合中的字型,同時通過頁面映射到頁面顯示出來。

解題思路:

1、從頁面中把字型下載下傳下來,儲存起來。

2、擷取頁面中對應的映射中文字元。

3、解析字型檔案,擷取字型中的編碼。

4、通過映射,找到對應的字型,解析出數字。

解題過程:

既然如此,那就幹呗!!!

下載下傳字型(部分代碼):

glidedsky挑戰-字型反爬2

擷取中文字元(部分代碼):

glidedsky挑戰-字型反爬2

解析字型(部分代碼):

這裡說明下,0-9的數字是自己通過對應的關系生成的。 在字型庫中,0-9數字的位置都是在[1,10]的位置

glidedsky挑戰-字型反爬2

可以得出這樣的資訊:

glidedsky挑戰-字型反爬2

字型間映射(部分代碼):

我這裡是通過字典去映射的,key為字型,value為數字值:

glidedsky挑戰-字型反爬2

産生結果:

glidedsky挑戰-字型反爬2

其它說明:

還是那句話:應于網站要求,這裡隻說思路和提供部分代碼。

在解析字型過程中,注意字型編碼問題,有些看起來同一字,但是編碼不同

glidedsky挑戰-字型反爬2

這個問題,我也不很明白,可能是在請求頁面時,編碼是utf-8編碼,而我用的是通過chr()進行ascii編碼,具體深入沒研究,有明白的歡迎留言。

繼續閱讀