Python 爬蟲進階必備 | 某新聞資訊站點參數(shù) _signature 邏輯分析 (無...
點擊上方“咸魚學(xué)Python”,選擇“加為星標(biāo)”
第一時間關(guān)注Python技術(shù)干貨!

圖源:極簡壁紙
今日網(wǎng)站
aHR0cHM6Ly93d3cudG91dGlhby5jb20v
不會吧,不會吧,不會有人還不會頭條的sign吧
抓包分析與加密定位
打開網(wǎng)頁,隨便找到一個欄目,向下滑動可以抓到以下的請求包

這里提交的參數(shù)里就有我們需要分析的參數(shù)_signature
現(xiàn)在直接搜索_signature,就可以直接定位到相關(guān)的位置了

在這個文件中再次搜索,就可以看到如下代碼

這里的r就是我們需要獲取到的_signature
加密分析
先打上斷點,可以看到,當(dāng)代碼運行到n的時候,還沒有生成_signature


當(dāng)繼續(xù)向下運行到r的時候就返回_signature的值了,所以上面那一大坨的代碼里面只有S的邏輯才是我們需要的

進入S中再次分析

這里可以看到傳入的參數(shù)只和url有關(guān),o以上的代碼都很簡單就是對url進行拼接的操作而已,但是最后返回的o等于一大長串
繼續(xù)看o的邏輯
var?o?=?(null?===?(n?=?window.byted_acrawler)?||?void?0?===?n???void?0?:?null?===?(r?=?n.sign)?||?void?0?===?r???void?0?:?r.call(n,?i))
看這個邏輯之前,需要有幾個關(guān)于 js 的姿勢儲備
1、===,這個的意思就是判斷三等號左右兩端的值和類型是否相等,只有值和類型都相等才為true
2、value = 條件?值1:值2,這個是當(dāng)前面的條件判斷為true時,賦值值1,為false時返回值2
3、||, 或的邏輯運算符,參與運算的任意一個參數(shù)為 true,返回的結(jié)果就為 true,否則返回 false
了解了上面的幾個 js 知識之后,現(xiàn)在再來看o
首先null === (n = window.byted_acrawler)肯定是不相等的,所以這個時候o可簡寫為
var?o?=?(false?||?void?0?===?n???void?0?:?null?===?(r?=?n.sign)?||?void?0?===?r???void?0?:?r.call(n,?i))
之后void 0 === n肯定也是不相等的結(jié)果為 false,所以void 0 === n ? void 0 : null === (r = n.sign)返回的是null === (r = n.sign),同時null === (r = n.sign)也是不相等的,這個時候o可簡寫為
var?o?=?(false?||?false?||?void?0?===?r???void?0?:?r.call(n,?i))
同樣的void 0 === r的結(jié)果是false,返回的是r.call(n, i),這個時候o可簡寫為
var?o?=?(false?||?false?||?r.call(n,?i))
這個時候的邏輯運算結(jié)果var o = r.call(n, i)
這里的n是window.byted_acrawler,這里的i是上面拼接好的url,r是n.sign也就是window.byted_acrawler.sign
var?i?=?{
????url:?a?+?e
};
所以o就是window.byted_acrawler.sign.call(window.byted_acrawler,url),簡化的結(jié)果就是window.byted_acrawler.sign(url)
現(xiàn)在就是jsvmp了,反正我干不出來,補環(huán)境直接沖就是了

這個js放到html就能直接用

就是有點短,不過用來請求問題不大
如果要用node直接運行,肯定會報錯的,因為node少瀏覽器環(huán)境,這個大家應(yīng)該都知道
這里提供兩個方案
1、jsdom,這個不會補環(huán)境的朋友應(yīng)該沒少用吧,npm instal jsdom,就可以安裝了,然后按照運行報錯缺啥補啥就行了
2、這個可以參考補環(huán)境的課程,用 vm2 補,補的視頻鏈接放后臺,回復(fù)【補環(huán)境】獲取,照著來就行。
好了,以上就是今天的全部內(nèi)容了。
我是沒有更新就在摸魚的咸魚
收到請回復(fù)~
我們下次再見。
對了,看完記得一鍵四連,這個對我真的很重要。
