Python 爬蟲進(jìn)階必備 | 某工業(yè)超市加密 header 參數(shù)分析
今日網(wǎng)站
aHR0cHM6Ly93ZWIuemtoMzYwLmNvbS9saXN0L2MtMjYwMTg2Lmh0bWw/c2hvd1R5cGU9cGljJmNscD0x
這個(gè)網(wǎng)站是在某交流群看到的,隨手保存下來(lái)作為今天的素材

抓包分析與加密定位
先看看抓包的結(jié)果,可以看到請(qǐng)求的header中包含兩個(gè)未知的參數(shù),分別是zkhs和zkhst

進(jìn)一步檢索參數(shù)zkhst和zkhs,可以發(fā)現(xiàn)這兩個(gè)參數(shù)的值沒有做過(guò)混淆
并且都有對(duì)應(yīng)的搜索結(jié)果


根據(jù)搜索結(jié)果的提示inde,進(jìn)一步在文件中檢索zkhst和zkhs
可以在文件中找到下面這幾個(gè)關(guān)鍵位置

加密分析
在邏輯里比較明顯的是
e.headers.zkhs?=?o,e.headers.zkhst?=?r
這行代碼預(yù)示我們要分析的是o和r這兩個(gè)變量
這兩個(gè)變量的賦值分別可以在上面的 js 邏輯中找到
o?=?u()("body=".concat(i,?"¶ms=").concat(o,?"&sign_token=").concat(r),?r)
r?=?Object(s.f)("zkhst")
接下來(lái)只要單點(diǎn)調(diào)試即可,先來(lái)看o的生成
o的邏輯是將所有的參數(shù)拼接,傳入u()中計(jì)算
這里的參數(shù)是一個(gè)逗號(hào)表達(dá)式,最后得到的傳入?yún)?shù)是r
r?=?("body=".concat(i,?"¶ms=").concat(o,?"&sign_token=").concat(r)
這里較為明顯的未知參數(shù)是body以及sign_token
可以通過(guò)斷點(diǎn)分析得到下面的結(jié)果,這個(gè)結(jié)果就是計(jì)算后的r
body={"brandId":"","catalogueId":"260186","cityCode":350100,"clp":true,"extraFilter":{"inStock":false,"showIndustryFeatured":false},"from":0,"fz":false,"keyword":"","productFilter":{"brandIds":[""],"properties":{}},"rangeFilter":null,"searchType":{"notNeedCorrect":false},"size":20,"sort":0}¶ms={"traceId":"213681131613962067063"}&sign_token=799c9842f09c490196047064e10dead8
網(wǎng)站的開發(fā)很貼心了,還在邏輯里加了console.log

body和parmas都是查詢參數(shù),body中包含了城市信息之類的內(nèi)容,這個(gè)需要根據(jù)要爬取的內(nèi)容修改
除此之外還有sign_token未知,這個(gè)就是另一個(gè)要分析的參數(shù)zkhst
zkhst 獲取
經(jīng)過(guò)調(diào)試得到下面這個(gè)結(jié)果,在定位的js中有一個(gè)switch控制流
在918行,會(huì)進(jìn)行一次判斷,如果r = Object(s.f)("zkhst")沒有獲取到值,會(huì)進(jìn)入到Object(l.i)();這個(gè)邏輯。如果有值會(huì)break進(jìn)入926行的邏輯。

所以需要先把Object(s.f)("zkhst")的值變?yōu)?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(71, 193, 168);">undefinde,進(jìn)入s.f中,可以看到下面這段邏輯
?h?=?function(t)?{
????????t?=?document.cookie.match(new?RegExp("(^|?)".concat(t,?"=([^;]*)(;|$)")));
????????return?null?!=?t???decodeURIComponent(t[2])?:?null
????}
可以得到zkhst是從cookie中得出的,直接清除cookie中的zkhst就能進(jìn)入生成的邏輯
所以清除瀏覽器緩存/cookie
順利進(jìn)入(l.i)(),可以看到下面這串邏輯

并且在network中也的到印證

這個(gè)zkhst是由頁(yè)面請(qǐng)求返回得到的。
至此兩個(gè)加密參數(shù)均已得到,就可以獲取頁(yè)面的數(shù)據(jù)了。
好了,今天的文章就到這里了,我們下次再會(huì)~
有知有行
[ 完 ]
對(duì)了,看完記得一鍵四連,這個(gè)對(duì)我真的很重要。

對(duì)了,看完記得一鍵四連,這個(gè)對(duì)我真的很重要。