爬蟲網路請求之JS解密一(百度企業信用)

2021-10-07 06:51:22 字數 3363 閱讀 4901

反爬策略中最重要的一塊領域就是在前端利用js對資料請求引數進行加密或者資料隱藏(如大眾點評的影象位移技術,即使使用**也是無濟於事,必須對js進行驅動才能獲取到資料。

這裡有兩種方案,一種是用selenium+瀏覽器,來驅動瀏覽器來載入資料,基本能解決所有js問題,但是此方案效率非常低下,如果資料採集量大或更新頻率高,非常不推薦這種方式。

另一種方案採集效率非常高效,需要對網頁js進行研究和分析,最後轉換成自己的**以此來驅動js完成資料的載入。所以對js研究和解密是學習研究網路爬蟲必不可少的一項技能。

所以我會將遇到的一些js加密研究和解密方式放上來,與大家一起學習**。僅供學習參考,切勿用於商業用途。

一、js加密研究

(1)介紹

(2)頁面分析

圖1-1 變更記錄介面引數

我們看到變更記錄的介面鏈結,同時發現請求是get方式,需要三個引數pid、tot、

。這裡只有pid是必須的,pid獲取方式在搜尋頁面時獲取如圖1-2所示:

圖1-2 pid獲取方式示例圖

「」這個引數後面是一串數字,其實就是當前請求的時間戳,一般都是13位數字。

最後我們來找tot引數,如何獲取。

(3)js解密

這一步很重要,需要從大量js檔案中去找乙個引數,並且不會有注釋,所以還需要有一點js基礎。通過翻js檔案,乙個個搜尋可以發現tot如圖1-3所示:

圖1-3 查詢js關鍵引數位置

我們可以看到tot值等於window.tk。這裡有個window的意思,其實是指整個視窗頁面,也就是說在動態的網頁下,js控制視窗的值來實現頁面「動態」。那麼我們直接去主頁面的elements找就可以找到相關資訊,通過檢索window.tk 可以發現 如圖 1-4所示:

圖1-4 檢索window.tk位置

這一步需要讀js**,所以最好有一點js基礎,並不需要完全讀懂,只需要了解他引數請求方式和哪個函式有關即可。這裡可以看到window.tk=mix(tk,baiducode),而function mix(tk,bid)函式已經給出,我們只需要獲取tk與baiducode值即可。

下面展示一些 `內聯**片`。

rule = re.

compile

('var tk = document.getelementbyid\(\'(.*?)\'\).getattribute\(\'(.*?)\'\);'

,re.s)

tk1,tk2 = re.findall(rule,response.text)[0

]#先從js中獲取有tk內容標籤的id值和屬性名

print

(tk1,tk2)

rule = re.

compile

(tk2+

'="(.*?)"'

) tk=re.findall(rule,response.text)[0

]#從對應標籤中獲取tk值

]#從對應標籤中獲取baiducode值

做到這裡,我們已經籌齊了所以關鍵引數,只需要帶入function mix(tk,bid)函式中,即可得到tot值,這裡有兩種辦法,第一種:讀懂js**,翻譯成對應語言,得出結果。第二種:呼叫execjs這種能夠執行js的內庫,呼叫執行js介面得出結果。這裡我推薦第二種,方便簡單。

使用教程可以參考這裡:python3呼叫js的庫之execjs

二、**實現

這裡貼出獲取tot引數過程中解密方式。由於execjs在python3.5版本會有問題,主要是execjs本身也是用python2.7版本寫的,所以用python3以上版本會有一點問題,所以這裡節約時間就用python2.7版本做測試。

''#這裡先請求主頁面,然後分析js

response=requests.

get(url,headers=

) rule = re.

compile

('var tk = document.getelementbyid\(\'(.*?)\'\).getattribute\(\'(.*?)\'\);'

,re.s)

tk1,tk2 = re.

findall

(rule,response.text)[0

]#先從js中獲取有tk內容標籤的id值和屬性名

rule = re.

compile

(tk2+

'="(.*?)"'

) tk=re.

findall

(rule,response.text)[0

]#從對應標籤中獲取tk值

]#從對應標籤中獲取baiducode值

三、總結

僅供學習參考,切勿用於商業用途

一 解密網路爬蟲之Request庫

request庫的七個常用方法 方法 說明1 request.request 構造乙個請求,支援以下各種方法的基礎方法 2 request.get 獲得html網頁的主要資訊,對應於http的get 3 request.head 獲取html網頁的頭資訊,對應於http的head 4 request...

Python爬蟲 網路請求 urllib

簡單的請求from urllib.request import urlopen 發起網路請求 response urlopen assert response.code 200print 請求成功 儲存請求的網頁 file變數接受open 函式返回的物件的 enter 返回結果 with open ...

爬蟲網路請求模組urllib

url 統一資源定位符 uniform resource locator https 協議 new.qq.com 主機名 網域名稱 省略了埠 443 omn twf20200 twf2020032502924000.html 訪問資源的路徑 anchor 錨點 前端用來做頁面定位或者導航 from ...