Python 爬蟲(chóng)進(jìn)階必備 | 某代理站免費(fèi)代理加密邏輯分析
今日網(wǎng)站
aHR0cHM6Ly93d3cuemRheWUuY29tL0ZyZWVJUExpc3QuaHRtbA==
這個(gè)網(wǎng)站來(lái)自咸魚(yú)的技術(shù)交流群

抓包分析與加密定位
這個(gè)網(wǎng)站是某代理商的免費(fèi)代理頁(yè)面,我們想要實(shí)現(xiàn)的就是這個(gè)頁(yè)面上免費(fèi)代理的提取。
所以先看看反爬的措施是什么?

可以看到 ip 在 response 中的展示的不全,ip 最后一位顯示的是wait,通過(guò)排查 css 以及字體文件可以先得出一個(gè)結(jié)果,這個(gè)反爬不是字體反爬或 css 反爬
為了確定這個(gè)反爬是不是js反爬,我們可以禁用當(dāng)前網(wǎng)站的 js文件,查看頁(yè)面的展示是否有變化。

當(dāng)禁用了頁(yè)面的js后,可以看到頁(yè)面上展示的結(jié)果已經(jīng)無(wú)法展示完整的 ip 地址了,所以可以判斷頁(yè)面上的ip展示是由 js 控制的

現(xiàn)在需要定位這個(gè) js 邏輯的位置,先看看檢索wait能不能找到有關(guān)的內(nèi)容

這里直接說(shuō)結(jié)果,檢索的工作量太大了,90 個(gè)匹配項(xiàng)相關(guān)性都不大,所以先看看別的方法,如果都沒(méi)有收獲的話再回來(lái)繼續(xù)分析。
通過(guò)上面這張圖,看到替換的位置有v的值是很特殊的,不過(guò)經(jīng)過(guò)上面的檢索,想通過(guò)這個(gè)方法去找到加密的直接可以放棄了。

所以繼續(xù)回到抓包界面試試看。
在抓包的界面里,認(rèn)真分析還是可以看到一個(gè)相關(guān)項(xiàng),這個(gè)請(qǐng)求鏈接長(zhǎng)得很奇特。

這么一長(zhǎng)串的鏈接就很可疑,不過(guò)這個(gè)請(qǐng)求返回的是一個(gè)數(shù)值沒(méi)有太多有價(jià)值的信息,所以直接看看這個(gè)數(shù)值是具體用在哪里
因?yàn)槭且粋€(gè) xhr 請(qǐng)求,所以直接用 xhr 斷點(diǎn)找就很方便

斷點(diǎn)打上之后,就出現(xiàn)一些有意思的地方了

往上兩個(gè)堆棧可以看到,返回值是需要經(jīng)過(guò)一通操作才可以的

再網(wǎng)上看,可以看到這里的邏輯就比較顯眼了,直接對(duì) document 進(jìn)行操作了

代碼拿到 console 中測(cè)試可以獲取到帶wait的值

整個(gè)函數(shù)運(yùn)行下來(lái)就可以直接獲取到完整的ip了

現(xiàn)在就只要找到這一套字符串替換的邏輯就可以獲取完整的 ip 了
加密分析

先看請(qǐng)求的是怎么發(fā)出的,上面的圖中前一段的domain是固定的
后一段的鏈接由兩個(gè)參數(shù)拼接

這里未知的是mk、showm、ak這三個(gè)參數(shù)
這里的mk是固定值 = xxxmxxxxxxxxxm398mxxx1m402
后面發(fā)現(xiàn)這個(gè)值是經(jīng)過(guò)加密的請(qǐng)求 ip

這里的ak是動(dòng)態(tài)的,所以還需要構(gòu)建一個(gè)請(qǐng)求動(dòng)態(tài)獲取

再來(lái)看看showm這個(gè)加密,選中即可跳轉(zhuǎn)

這個(gè)比較簡(jiǎn)單直接扣取到 node 環(huán)境下運(yùn)行即可


本地運(yùn)算的結(jié)果如下

這樣就可以得請(qǐng)求的鏈接獲取這個(gè)請(qǐng)求返回的值代入運(yùn)算
拿到這個(gè)值之后就可以看看接下來(lái)進(jìn)行的操作了

接下來(lái)可以看到out()這個(gè)方法獲取的是當(dāng)前這個(gè) ip 列表的長(zhǎng)度
function out() {
var myTb = document.getElementById("ipc");
if (myTb) {
return myTb.getElementsByTagName("tr").length - 1
} else
return 0
}
經(jīng)過(guò)out1()取出每一行 ip 中v的值,這個(gè)和我們抓包部分想要從v入手找加密邏輯相印證。


將這個(gè)值和上面構(gòu)建請(qǐng)求獲取的值,一起代入dsfgsd運(yùn)算,就可以得出還原好的 ip 了

所以正確的請(qǐng)求順序如下
1、請(qǐng)求 base.js 獲取mk和ak這兩個(gè)值,構(gòu)造下面的請(qǐng)求,獲取返回的值

2、請(qǐng)求免費(fèi)代理的頁(yè)面,獲取帶wait字符的ip還有對(duì)應(yīng)的v
3、將每一個(gè)v和 1 中的返回的值,傳入dsfgsd中計(jì)算,并將結(jié)果替換得出正確的 ip
雖然是免費(fèi)的 ip 代理,不過(guò)站方這個(gè)思路可以說(shuō)非常用心了
好了,今天的文章就到這里了,我們下次再會(huì)~
對(duì)了,看完記得一鍵四連,這個(gè)對(duì)我真的很重要。
