Python爬蟲進階必備 | 加密分析
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理
以下文章來源於騰訊雲 作者:鹹魚學Python
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )
這次來分析某個小說網站。
分析請求
先來看看頁面的請求【圖1-1】
圖1-1
經過檢視請求,並沒有請求的加密引數,但是響應的內容卻不正常,許多文字在響應中都變成了 span 標籤【圖1-2】
圖1-2
這樣的反爬蟲措施,如何分析?
定位加密
既然這裡替換的內容都是 span 那就從它開始入手吧。
可以看到應該顯示在正文的內容顯示在 CSS 的 content 中【圖2-1】。
圖2-1
這個是什麼操作?容我百度一下。
CSS中,::before 建立一個偽元素,其將成為匹配選中的元素的第一個子元素。常通過 content 屬性來為一個元素新增修飾性的內容。此元素預設為行內元素。
這裡附帶一個語法示例【圖2-2】,加深理解:
圖2-2
現在通過上面的例項描述,我們大致清楚原來它是一種 CSS 的隱式寫法。
一般 CSS 樣式我們可以通過點選右上角的連結跳轉到相應的檔案位置,但是這裡是無法跳轉的【圖2-3】
圖2-3
我們照著之前的思路,搜尋一波看看能不能找到一些蛛絲馬跡。
先試試搜尋類名【圖2-4】,找到的是請求頁面的響應內容,並沒有找到有用的資訊。
圖2-4
繼續搜尋::before,這次找到的同樣是請求頁面的響應內容但是::before在檔案的位置值得我們開啟看看。【圖2-5】
圖2-5
點開檔案再次搜尋,在這裡就定位到了疑似加密的地方【圖2-6】,對!只是疑似加密。
圖2-6
你不能因為程式碼長得醜、難理解就懷疑它是加密。
其實這裡也可以全域性搜尋.context_kw可以找到操作 DOM 的程式碼,可以找到操作 DOM 的加密位置,搜尋方法大同小異。
這裡就不細說了,我們只要找到加密邏輯的整體位置就行,不妨礙我們分析。
ps : 怕自己找錯可以多試幾次,相關檔案都開啟看看。
分析與改寫
既然找到一個疑似加密的位置,我們肯定是要分析一波看看是不是我們要找的。
通過大概的梳理,可以看到整個 JS 分為兩個部分,第一部分 JS 是CryptoJS的加解密的內容,第二部分是經過混淆的內容,根據部分 JS 可以猜測第二部分的 JS 操作了 DOM ,完成了 CSS 相關的解密。【圖3-1】
關於第一部分的CryptoJS沒啥好改的,照著用就好了。
第二部分值得研究一下,因為是混淆過的內容,照著還原回原來的程式碼意義不大且費時費力,需要做的就是不停除錯你看不明白的程式碼,爭取能明白這個程式碼的意思,能理解的程式碼越多,去改寫越簡單。
圖3-1
簡單說下程式碼的邏輯:
- 先取出 _0xa12e這個數組裡面一個加密過的元素,取出後用 AES解密
圖3-2
在 node 中執行輸出的結果是這樣的【圖3-3】
圖3-3
很明顯 node 環境下輸出的結果不是我們要的,而且字元數也少了兩個,同一份程式碼環境不同,可以大致猜到可能是程式碼裡做了一些對環境屬性的判斷。
這個時候理解程式碼的好處就來了,可以很快定位到下面這行程式碼【圖3-4】:
圖3-4
這裡檢測的是當前的 URL ,在瀏覽器中這個判斷條件是不成立的【圖3-5】,所以不執行判斷中程式碼。
圖3-5
到了 node 環境下是沒有瀏覽器的window屬性的,所以執行這句會出現異常,執行的是異常處理中的程式碼,所以我們直接把這段if程式碼註釋掉。
繼續向下,找找還有沒有相關的程式碼,只要是判斷瀏覽器相關屬性的都需要注意一下。
很快看到【圖3-6】這一行的程式碼也進行了相關的判斷。
圖3-6
在瀏覽器環境下程式碼的結果是這樣的【圖3-7】
圖3-7
但是在 node 環境下是這樣的,計算結果也相應的出現了錯誤【圖3-8】
圖3-8
所以這裡需要做相應的修改,讓結果能夠計算正確。
例如:
_0x1532b6[_0xea12('0x26')](_0x490c80, 0x3 * +!('object' === _0xea12('0x27')))
這樣 node 環境下的計算結果就正常了。
將經過處理後的 JS 運用到 Python 爬蟲中,就可以看到正確的內容了【圖3-9】
圖3-9
總結
這個網站的加密不是很難,不過加密的方法很典型,前段時間有不少讀者朋友在群裡討論研究,非常值得學習一下。
不過既然是小說網站,這裡也涉及到相關的版權問題,所以希望大家不要搞事,以學習的態度和目的閱讀本文。
Peace~