嘿嘿嘿,小帥b又來跟你說說一些爬蟲過程中需要斗智斗勇的事情了,,這次咱們就來說說關于一些 JS 混淆加密的事,。所謂 JS ,就是 JavaScript ,,一種前端的腳本語言,,一般情況下每個網(wǎng)站都需要 JS 來做一些數(shù)據(jù)交互,頁面渲染等一些異步操作,。當然,,對于反爬的人來說,JS 的用處還可以用來對一些數(shù)據(jù)進行加密,。 今天咱們就以有道詞典這個在線翻譯的網(wǎng)站為例,,看看他們是如何加密請求數(shù)據(jù)的,以及小帥b是如何通過 Python 模擬請求從而獲得關鍵數(shù)據(jù)的,。 咱們打開有道翻譯的網(wǎng)站:http://fanyi.youdao.com/ 輸入中文然后點擊翻譯按鈕就會翻譯出來英文,,比如: Hello, everyone, I'm Small handsome b. 哈哈哈,ok,,我們打開開發(fā)者工具,,按下 F12 來抓一下數(shù)據(jù),當我們點擊翻譯的時候,,可以看到有了一個請求: 點進去看可以發(fā)現(xiàn),,POST請求的地址是: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule 我們再來看一下請求過去攜帶的參數(shù)是啥 可以看到,還是需要挺多參數(shù)的,,其中的 i 就是我們要翻譯的內(nèi)容,,那簡單啊~想要得到翻譯后的數(shù)據(jù),那么我們直接把請求頭和所需參數(shù)的值復制一下,,然后用 requests 請求一波不就搞定了,? 說干就干,代碼走起,! 定義一個請求的 url 和 headers 再把 form data 的數(shù)據(jù)整過來 requests 走起 運行一波 what,? 返回的是一個錯誤碼。 好的吧,,如果是這么簡單,,小帥b何必寫這篇教程呢,?如果你之前玩過加密相關的,那么你應該對 form data 中的 salt,、sign 這兩個字眼不陌生,,那么,如何破呢,? 接下來就是: 學習 python 的正確姿勢 我們再點多幾次翻譯按鈕,,然后就可以看到有多次請求。 可以發(fā)現(xiàn),,每一次的請求中的 salt,、sign、ts,、bv 參數(shù)是會一直變化的。 how to do it,?我們回到 NetWork ,,我們看到 Initiator 這一欄,可以看到它請求到了 fanyi.min.js:1 這個 js 文件,。 我們就點 fanyi.min.js:1 進去看看,,牛的一比,直接看不懂... 還好,,左下角有一個 {} ,,可以點一下 發(fā)現(xiàn)有驚喜,直接幫我們把壓縮的 js 代碼格式化,。 牛逼不,,行號都給我們顯示出來了,不過到了這里,,依然懵逼,,我們還是不知道怎么拿到 salt、sign,、ts,、bv 這些參數(shù)的值... 咋辦?恩,,Chrome瀏覽器的打斷點功能在這個時候就要派上用場了,。這時候還要把帥b語錄搬過來應景哈哈哈。 那么如何使用斷點功能呢,,我們看到 Chrome 的右邊是這樣的: 看到這個 XHR/fetch BreakPoints 沒,,在這里我們可以添加 url ,根據(jù)請求這個 url 打斷點,。而我們要打的斷點就是一開始獲取到的請求 url : http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule 點擊 XHR/fetch BreakPoints 右邊的 + 號,,然后把鏈接復制進去: 這時候再點擊翻譯按鈕: 突然,,你的屏幕一灰,表示好事將近,,我們成功打上了斷點,,也就是說,現(xiàn)在我們可以在請求之前做一些騷操作,。 這時候我們將右邊的 Call Stack 展開: 這些,,就是我們在點擊翻譯按鈕之后,會調(diào)用到 js 里面的方法,,從這里下手,,來尋找那些參數(shù)是被如何加密的,說實話,,用文字來說怎么去 debug 有點繁瑣..要不,,視頻走起? (放大看) 挖槽,,我 1080p 的視頻被騰訊壓縮成 av 畫質(zhì),,但也不能否認我是全網(wǎng)第一良心博主有沒有,請叫我良心b?。,。?/span> 通過帥b的視頻,,相信你已經(jīng)知道了這些參數(shù)是如何加密的了,,那么接下來就可以通過 Python 模擬了。 代碼走起,! ts 在 js 中是這樣的: r = "" + (new Date).getTime() 那么在 Python 中就是這樣的: bv 在 js 中是這樣的: n.md5(navigator.appVersion)
salt 在 js 中是這樣的: r + parseInt(10 * Math.random(), 10) 那么它在 Python 中就是這樣的: sign 在 js 中是這樣的: n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE") 那么它在 Python 中就是這樣的: 所以我們獲取 form data 的方法就是這樣的: 那么我們的請求就可以這樣: 這樣我們就使用了最正確的參數(shù)值來請求了,,運行一波: cool~~~拿到數(shù)據(jù)啦,!順便說一句,,用到的庫有這么幾個: 完事了! ps:覺得對你有幫助,,給我點個在看,,轉(zhuǎn)發(fā),贊賞,。讓帥b老仙,,一直法力無邊。另外,,接下來會有騷動作,,為了能讓你及時收到通知,趕緊把這個公眾號設置為星標,,以免到時虧得一批,,我們下回見,peace,! 掃一掃 學習 Python 沒煩惱
|
|