對于某高考志愿信息網站寫了一個爬蟲, 遇到了一些問題, 在這里記錄一下, 順便學到了一些反爬蟲的技巧.
獲取每個學校的分數線情況, 首先在瀏覽器查看所有請求, 找到獲取數據的請求, 但是可以發現他這個請求回來的某些數據應該是經過加密的.
這個解密代碼一定在客戶端, 因此我們找找, 看看能不能找到解密的代碼. 首先我們添加請求斷點, 看看能有什么突破.
接下來觸發請求, 我們來看一下Call Stack中的信息, 經過排查, 我們可以發現如下重要的函數:
通過查找源碼, 我們找到上面的那個函數的源碼, 這里代碼沒經過壓縮和混淆, 因此可讀性是真的好, 太良心了. 我們可以發現其中的兩個關鍵的函數showNumber和cnDeCrypt, 猜測應該是這兩個函數完成的對于參數的解密
直接在這些函數下斷點, 來看看具體的調用, 我們可以發現showNumber的代碼非常簡單, 這里就不解釋了.
接下來是cnDeCrypt, 這個函數看起來比較復雜, 實際上, 可以直接復制代碼到控制臺, 這個是可以直接執行的, 簡單分析一下可以知道他調用了split()和forEach兩個函數
在這里, 簡單翻譯一下這段代碼吧, 到這里, 這個函數的作用就十分明顯了.
var _cnDeCrypt = function (zlVjhiyMm1) { var YB2 = ""; zlVjhiyMm1.split("|").forEach(function ($lvd3) { if ($lvd3.search(/【(.*?)】/) !== -1) { YB2 += $lvd3.replace('【', '').replace('】', ''); } else { $lvd3 = $lvd3.replace(/[g-t]/ig, ""); YB2 += "&#x" + $lvd3 + ";" } }); return YB2 }最后我們可以發現, 最終返回的是html編碼, 但是這個和數據好像并不一樣, 我們審查元素來看看, 發現其內容是看不懂的內容, 這里感覺應該是采用了字體加密
我們通過請求搜索一下字體文件, 我們可以發現如下的可疑文件, 利用FontEditor, 來查看一下.
首先打開數字來看看, 字符串和數字差不多, 在這里就不截圖展示了.