王朝陽,范伊紅,李夢丹,忽愛平
(河南科技大學軟件學院,河南 洛陽 471000)
在互聯網的大千世界里,Python網絡爬蟲已經成為程序員對某個網站數據獲取、數據分析的一項重要的工具。爬蟲使人們的生活更加便利,尤其是其廣泛運用于搜索引擎、數據收集、廣告過濾等日常生活中的各個方面。如今,網絡爬蟲技術的基本實現方法不計其數,運用簡單的互聯網技術就能獲取完整的爬蟲代碼,故本文不再復述這些代碼,而主要聊聊一種爬蟲中所用到的JavaScript逆向技術(下文簡稱“JS逆向技術”),這種技術主要是為了解決網絡數據抓取時所遇到的參數加密、數據加密等問題[1]。
當順利抓取到網頁的HTML代碼時,有一部分網站,例如某翻譯、某土地市場網等,夾雜著許多的加密數據,或者是一些看不懂的參數,這些數據會阻礙下一步的解析和運用,這時就需要運用JS逆向技術反解JS代碼對這些數據進行解密,從而重寫并模擬JS操作。
本文就以某翻譯網站為例,來解析Python環境下的JS逆向技術的實現過程。也許這個網站解析出的數據價值性沒有想象的高,但目的不是獲取有價值的數據,而是通過對這個網站爬取時所遇到的數據加密問題進行解析,從而獲取模擬真實的網絡請求[2]。這個技術會是大家探索網絡爬蟲的一個重要方向。
首先需要做的任務是利用爬蟲技術獲取翻譯前后的內容。打開翻譯網站,在左邊輸入框中輸入‘man’英文字符,點擊“翻譯”按鈕,右邊翻譯框會輸出一個“男人”的譯文。這時打開F12開發者工具,選擇Network選項,從中可以獲取到所有網絡發出的請求。怎樣找到哪一條是關鍵的請求呢?因為做的是翻譯工作,可以嘗試在Filter中輸入‘tran’的字樣進行過濾操作,果然過濾到了一條translate的請求,這時候可以盲猜這條請求就是所需要的請求。
用requests庫編寫一個基礎的爬蟲代碼后,將請求頭中的cookie,header等信息放入爬蟲代碼,把參數一個一個地注釋,再進行編譯并打印出狀態碼,從中可以看到,如果打印“500”則證明此參數影響了請求,則此參數是有價值的,這就是尋找有用參數的方法。通過尋找發現關鍵參數有“OUTFOX_SEARCH_USER_ID”“salt”“sign”3個參數,通過多次請求比較,將會發現第一個參數在每次請求中都是不變的,所以最終確定兩個加密變化參數“salt”“sign”。
在開發者工具中搜索這兩個參數,能找到一個js文件,這個就是要對其逆向的文件。在文件中查找參數名,可以發現12條相關數據,從其中篩選出純參數數據,在其位置打上斷點并進行編譯。通過刷新頁面,可以發現下面這段代碼出現了問題(見圖1)。

圖1 斷點尋找加密方式
可以看出salt的值是變量i,在第8 371行中顯示,i的值為變量r+14位的隨機數,再從8 370行中可以看出,變量r是一個時間戳,這就完美地解出了“salt”變量的組成。同理,從中能了解到,“sign”變量的組成是一個md5加密的數據,提供的參數為要翻譯的字符串和“salt”值的拼接。參數的組成清晰又明朗,對下一步的模擬請求發送起著關鍵性的作用[3]。
了解到數據如何構成之后,開始使用Python對整個請求發送進行模擬。自己定義時間戳和隨機數,拼接為“salt”和“sign”參數,根據業務邏輯完成整個爬蟲流程,如下文代碼段。


得到模擬的請求參數之后,將參數嵌入爬蟲代碼中,并且根據網頁結構找到翻譯結果的位置,從而進行發送請求。實現方法如下文代碼段。


模擬請求發送后,使用重寫的爬蟲,得到翻譯框中翻譯的數據,并且可以根據不同的語言得到不同的翻譯結果。例如輸入‘Long time no see’,得出結果“好久不見”。
JS逆向技術可謂是探索爬蟲領域的重要工具。通過對此翻譯網站的網頁結構分析,找出隱藏在其中的加密參數;通過斷點技術,找出參數的加密方式。相比于傳統爬蟲,可謂是更上一層樓。希望這種技術可以為讀者開辟一種新的思路。JS逆向技術的道路很長,有些網站構成復雜,僅僅拿到js文件并不是所謂的全部。在短短一秒鐘內,執行的代碼多達上萬行,這時就需要耐心分析,一步一個腳印,找出神秘之處,從而達到所需的目標。如何從萬行代碼中突破重圍,如何將JS逆向技術加以改進,所有從事IT行業的人們都任重而道遠。