嘿嘿嘿,小帥b又來跟你說說一些爬蟲過程中需要鬥智鬥勇的事情了,這次咱們就來說說關于一些 JS 混淆加密的事。所謂 JS ,就是 JavaScript ,一種前端的腳本語言,一般情況下每個網站都需要 JS 來做一些資料互動,頁面渲染等一些異步操作。當然,對于反爬的人來說,JS 的用處還可以用來對一些資料進行加密。
今天咱們就以有道詞典這個線上翻譯的網站為例,看看他們是如何加密請求資料的,以及小帥b是如何通過 Python 模拟請求進而獲得關鍵資料的。
輸入中文然後點選翻譯按鈕就會翻譯出來英文,比如:
Hello, everyone, I'm Small handsome b.
哈哈哈,ok,我們打開開發者工具,按下 F12 來抓一下資料,當我們點選翻譯的時候,可以看到有了一個請求:
點進去看可以發現,POST請求的位址是:
我們再來看一下請求過去攜帶的參數是啥
可以看到,還是需要挺多參數的,其中的 i 就是我們要翻譯的内容,那簡單啊~想要得到翻譯後的資料,那麼我們直接把請求頭和所需參數的值複制一下,然後用 requests 請求一波不就搞定了?
說幹就幹,代碼走起!
定義一個請求的 url 和 headers
再把 form data 的資料整過來
requests 走起
運作一波
what? 傳回的是一個錯誤碼。
好的吧,如果是這麼簡單,小帥b何必寫這篇教程呢?如果你之前玩過加密相關的,那麼你應該對 form data 中的 salt、sign 這兩個字眼不陌生,那麼,如何破呢?
接下來就是:
學習 python 的正确姿勢
我們再點多幾次翻譯按鈕,然後就可以看到有多次請求。
可以發現,每一次的請求中的 salt、sign、ts、bv 參數是會一直變化的。
how to do it?我們回到 NetWork ,我們看到 Initiator 這一欄,可以看到它請求到了 fanyi.min.js:1 這個 js 檔案。
我們就點 fanyi.min.js:1 進去看看,牛的一比,直接看不懂...
還好,左下角有一個 {} ,可以點一下
發現有驚喜,直接幫我們把壓縮的 js 代碼格式化。
牛逼不,行号都給我們顯示出來了,不過到了這裡,依然懵逼,我們還是不知道怎麼拿到 salt、sign、ts、bv 這些參數的值...
咋辦?恩,Chrome浏覽器的打斷點功能在這個時候就要派上用場了。這時候還要把帥b語錄搬過來應景哈哈哈。
那麼如何使用斷點功能呢,我們看到 Chrome 的右邊是這樣的:
看到這個 XHR/fetch BreakPoints 沒,在這裡我們可以添加 url ,根據請求這個 url 打斷點。而我們要打的斷點就是一開始擷取到的請求 url :
點選 XHR/fetch BreakPoints 右邊的 + 号,然後把連結複制進去:
這時候再點選翻譯按鈕:
突然,你的螢幕一灰,表示好事将近,我們成功打上了斷點,也就是說,現在我們可以在請求之前做一些騷操作。
這時候我們将右邊的 Call Stack 展開:
這些,就是我們在點選翻譯按鈕之後,會調用到 js 裡面的方法,從這裡下手,來尋找那些參數是被如何加密的,說實話,用文字來說怎麼去 debug 有點繁瑣..要不,視訊走起?
Chrome如何debug 調試 js代碼https://www.zhihu.com/video/1130183428620136448
我是全網第一良心部落客有沒有,請叫我良心b!!!
通過帥b的視訊,相信你已經知道了這些參數是如何加密的了,那麼接下來就可以通過 Python 模拟了。
代碼走起!
ts 在 js 中是這樣的:
r = "" + (new Date).getTime()
那麼在 Python 中就是這樣的:
bv 在 js 中是這樣的:
n.md5(navigator.appVersion)
那麼它在 Python 中就是這樣的:
salt 在 js 中是這樣的:
r + parseInt(10 * Math.random(), 10)
那麼它在 Python 中就是這樣的:
sign 在 js 中是這樣的:
n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE")
那麼它在 Python 中就是這樣的:
是以我們擷取 form data 的方法就是這樣的:
那麼我們的請求就可以這樣:
這樣我們就使用了最正确的參數值來請求了,運作一波:
cool~~~拿到資料啦!順便說一句,用到的庫有這麼幾個:
完事了!
ps:覺得對你有幫助,給我點個在看,轉發,贊賞。讓帥b老仙,一直法力無邊。另外,接下來會有騷動作,為了能讓你及時收到通知,趕緊關注這個公衆号并設定為星标,以免到時虧得一批,我們下回見,peace!
掃一掃
學習 Python 沒煩惱