網(wǎng)易云音樂(lè)爬蟲(chóng)(JS破解全過(guò)程)

前言

有興趣的童鞋者吁,可以立馬抄起python爬網(wǎng)易云音樂(lè)的評(píng)論了。對(duì)于網(wǎng)易云音樂(lè)的破解遇八,網(wǎng)上已經(jīng)有很多現(xiàn)成代碼,你們可以直接拿起就用耍休,但這只會(huì)讓你知其然不知其所以然刃永,下一次換一道題目,你同樣不會(huì)羊精,還想等著抄答案嗎斯够?因?yàn)檫@個(gè)網(wǎng)站的反爬極具代表性,我花了好長(zhǎng)的時(shí)間才搞清楚其中的原理喧锦,現(xiàn)在读规,我在這里詳細(xì)講述爬取思路。

爬取分析

1.首先我們打開(kāi)網(wǎng)易云音樂(lè)隨便一首歌燃少,第一步束亏,先看翻頁(yè)邏輯,為什么呢阵具,我發(fā)現(xiàn)碍遍,比較高端的反爬多半都是AJAX異步為主的,果不然阳液,評(píng)論第二頁(yè)跟第一頁(yè)的地址是一樣的怕敬。說(shuō)的這里,小伙伴可以先去試試趁舀。
2.我們先試試能不能拿到數(shù)據(jù)赖捌,比如request的response,或者scrapy的調(diào)試模式矮烹,你會(huì)發(fā)現(xiàn)越庇,無(wú)論用哪種工具,評(píng)論數(shù)據(jù)都不在網(wǎng)頁(yè)里奉狈。
3.那么我用selenium的page_source呢卤唉,同樣也是不行。
那么數(shù)據(jù)在哪呢仁期?
現(xiàn)在我們打開(kāi)瀏覽器的fiddler桑驱,刷新抓包一下網(wǎng)頁(yè)
我以chrome舉例,你會(huì)發(fā)現(xiàn)跛蛋,數(shù)據(jù)在這個(gè)R_SO的XHR里面熬的。



讓我們直接調(diào)用這個(gè)API接口,返回了空白頁(yè)面赊级。那么我們?cè)賮?lái)分析這個(gè)數(shù)據(jù)是怎么請(qǐng)求的押框,切到headers頁(yè)面,你會(huì)發(fā)現(xiàn)理逊,這是一個(gè)post請(qǐng)求橡伞,傳入了兩個(gè)參數(shù)盒揉,一個(gè)是params,一個(gè)是encSecKey



這兩個(gè)參數(shù)是什么玩意?怎么來(lái)的
先不要急躁,我們先試試兑徘,直接傳入這兩個(gè)參數(shù)刚盈,模仿post請(qǐng)求,是否能得到數(shù)據(jù)呢挂脑?
簡(jiǎn)單的構(gòu)造請(qǐng)求

答案是可以的藕漱,感覺(jué)我們看到曙光了呢,那么我們?cè)賮?lái)看看最域,下一頁(yè)的params和encSecKey是否有改變谴分。
第一頁(yè)與第二頁(yè)params對(duì)比:
params:lSONbxzJJ8KQQzhI/6QMsCcDhFeUN7vdFJyvHyl0BEi/W2xUi32cLnkoKjOxTam/zz6r4G2Qyqct/nzc9Sx+BCXX4KGINEpLZBxaw3gOB4YFrOl6BDYvt6AVp2TobZ8KPl3lxAxKu196rJYb8eT2cL2hkb++joxlxoP+y5Xkuqh9FOkGl2WFOSQnCnjs22W7EzroZPb3Co/E3l208+W6nmWKNI9qHOxgiStuWa6gR+g=
params:ZJGaP/tOjowd89zzN5554gR30t9/ZYFTTQQclSpmcwN3fpymcuxQU0iEptA2jSl/STYs474HXE0O9TP/gcBo8Y2uAbC6ux/tkmb/PRm0RyWMgihRqZxMspI1S/oOm2ndLKmUNVc+8kq1IyL+jA6jzol1EMjKEBMvr1m25PARvDKAk3CnUOOXe3j+Tk3PEPFXQxtKDkPIkSMPDDbI9iiQvtrhUCmf/iXQFiN+GeyV34w=
第一頁(yè)與第二頁(yè)encSecKey對(duì)比:
encSecKey: 39027236d8ad00f00752c1d3773874e652f02fbc172c218ead51327e19b3feaf72fbf75d6e4f3a475e041db273b3ef6cae23feed1c593ffd5842f53bc626078de0cc3466c33d5b4572c464caa79c1fe5302fd7cfaf105dad044dfa16313a8d6d6c541fb18645894f71519064ba6257f5eea87527eea3169955f5bd7a74e4d6bd
encSecKey: 0970b9e51d4e42213b68d8761fdbb8cee06d198fe5500cd8184774d54a4af11058537c2f1671d2231f6cd6f6cf49dfe8c04367adb037552631ea787b453adf08bfaa10bc314b23e43b2c954072d0b6b2ee6d8b629b4de6d93191ba3c0036f039556736d5fbc63f45bcdc84a3b3ca525c51c3dce2d05a04f461d93d7850b5c017

明顯不一樣锈麸,所以我們現(xiàn)在已經(jīng)明確了問(wèn)題镀脂,如果我們要實(shí)現(xiàn)真正的爬取頁(yè)面,那么其實(shí)就是破解這兩個(gè)參數(shù)忘伞。

JS源頭

這里必須科普一下一個(gè)知識(shí)薄翅,我們之所以能看到五彩紛呈的頁(yè)面,并不是遠(yuǎn)程服務(wù)器加載好再給我們呈現(xiàn)出來(lái)的氓奈,而是就像正常的下載文件一樣翘魄。把服務(wù)的js文件下載下來(lái),然后在本地瀏覽器執(zhí)行舀奶。
這里可能會(huì)比較難懂一點(diǎn)暑竟,我們先點(diǎn)到之前抓包的R_SO文件,如圖操作育勺,找到這個(gè)R_SO文件的Initiator



image.png

這兩個(gè)參數(shù)但荤,是由這個(gè)core c245e96...的JS文件生成的。
我們涧至,現(xiàn)在直接左鍵點(diǎn)擊打開(kāi)這個(gè)JS文件腹躁。(在Chrome里面,當(dāng)你鼠標(biāo)移到上面南蓬,他會(huì)顯示這個(gè)Initiator發(fā)起的所有文件纺非,我們現(xiàn)在暫時(shí)不知道這兩個(gè)參數(shù)是具體由誰(shuí)生成的,所以要把所有JS都加載出來(lái))


JS

這是所有的JS赘方,這樣子的JS可讀性很差烧颖,所以我們把這一大段JS Ctrl+A,復(fù)制,然后再python里創(chuàng)建JS文件窄陡,然后粘貼炕淮,然后格式化。
格式化按鈕在這
Ctrl +A + L

好了泳梆,舒服了鳖悠,接下來(lái)榜掌,我們?cè)偎阉麝P(guān)鍵字,params和encSecKey憎账,很榮幸卡辰,我們找到了這兩個(gè)關(guān)鍵字所在函數(shù)。

接下來(lái)九妈,你怎么也必須

突然會(huì)看JS了吧瘾婿,你懂我意思吧

兄弟加油啊

JS破解

現(xiàn)在我們拿到了JS的內(nèi)容媚值,前面的一大段東西都不是事,重點(diǎn)還是我們破解JS的思路晶疼。當(dāng)我們搜索params的時(shí)候酒贬,會(huì)搜出37個(gè)matches。


params

我們?cè)偎阉裡nSecKey
enSecKey

很好,只有三個(gè)寒匙,你會(huì)發(fā)現(xiàn)锄弱,里面的JS函數(shù)是abcd這種難以閱讀的形式,對(duì)于我們這種半吊子現(xiàn)學(xué)現(xiàn)用的人來(lái)說(shuō)棵癣,會(huì)更加難以理解,所以必須要從簡(jiǎn)單的地方入手喜命。這里河劝,我們的切入點(diǎn)就是enSecKey赎瞎,為什么呢,因?yàn)闊o(wú)論你在里面如何修改,最終出口一定是含有params和enSecKey名字的參數(shù)喳篇,我們切到下面這個(gè)enSecKey位置


data

這里有個(gè)data關(guān)鍵字麸澜,里面正好是params奏黑,和enSecKey炊邦。
很大概率熟史,這是這兩個(gè)函數(shù)的出口蹂匹,我們看看源頭,往上面看一下怒详,這是由v0x.bl1x這個(gè)函數(shù)加載的
v0x.bl1x

來(lái)自昆烁,那么我們切回去剛剛那個(gè)找JS的地方看看缎岗。


發(fā)現(xiàn)加載的函數(shù)

十有八九就是這個(gè)函數(shù)传泊。
那么接下重頭戲,我們開(kāi)始閱讀這個(gè)JS
閱讀JS

params和encText都是由bY14p這個(gè)函數(shù)發(fā)起的拦盹,上面定義了這個(gè)一個(gè)BY14p函數(shù)普舆,我們先不管windows.asrsea是啥校读,先看后面的幾個(gè)參數(shù)。
var bYl4p = window.asrsea(JSON.stringify(i0x), bqv4z(["流淚", "強(qiáng)"]), bqv4z(QI7B.md), bqv4z(["愛(ài)心", "女孩", "驚恐", "大笑"]));

這里有4個(gè)參數(shù)蛾洛,我們稱(chēng)之為第一參數(shù)雁芙、第二參數(shù)、第三參數(shù)谎碍、第四參數(shù)
第一參數(shù):JSON.stringify(i0x)
第二參數(shù):bqv4z(["流淚", "強(qiáng)"])
第三參數(shù): bqv4z(QI7B.md)
第四參數(shù): bqv4z(["愛(ài)心", "女孩", "驚恐", "大笑"])
第二個(gè)和第四個(gè)參數(shù)椿浓,我們一眼就看得出,這是傳入實(shí)參提岔,在python里我們也知道笋敞,這一定是個(gè)定值。不信你們可以去翻閱一下bqv4z的加密方式赛惩,不過(guò)等等趁餐,我們?cè)倏吹谌齻€(gè)參數(shù)后雷,QI7B.md是啥,我們?nèi)タ纯?/p>

QI7B.md

這也是一個(gè)實(shí)參勉抓,那么真相只有一個(gè)候学,那就是第一參數(shù)一定是個(gè)變化的參數(shù)梳码。


發(fā)現(xiàn)變形參數(shù)

這里需要打住边翁,如果我們要繼續(xù)研究下去,有兩種發(fā)展思路叨咖,一個(gè)是閱讀JS,破解JS加密重構(gòu)Python代碼垛贤。這個(gè)難度趣倾,就算是學(xué)幾年爬蟲(chóng)的人估計(jì)都不一定達(dá)到。第二種善绎,為了不繞進(jìn)設(shè)計(jì)者的加密思路中诫尽,我們要用另外一種手段取得加密參數(shù)牧嫉,在這里,我介紹第二種方法曹洽,因?yàn)槿思以O(shè)計(jì)者想盡辦法讓你繞暈辽剧,你為什么一定要跟別人的長(zhǎng)處較勁呢抖仅,于是,我在這里隆重推薦這個(gè)抓包工具Charles

Charles的使用介紹比較復(fù)雜,你們可以自行去搜索教程安裝放吩,有可能我另起一個(gè)安裝教程羽杰,不過(guò)簡(jiǎn)單的來(lái)說(shuō),就是要你的瀏覽器安裝證書(shū)(或者手機(jī))因?yàn)镃harles默認(rèn)只支持http惕澎,所以你要適當(dāng)進(jìn)行設(shè)置颜骤。Charles怎么說(shuō)呢,就像是一個(gè)中介八孝,在實(shí)現(xiàn)服務(wù)器和你的電腦端交互的時(shí)候干跛,Charles作為中間過(guò)濾器給你篩選信息。
好了哥捕,我現(xiàn)在就當(dāng)你準(zhǔn)備好嘉熊。
用Charles我推薦用

火狐瀏覽器

回到上文记舆,現(xiàn)在,我需要重寫(xiě)JS代碼御蒲,在不影響整體運(yùn)行的情況下诊赊,我需要知道碧磅,傳入的這幾個(gè)參數(shù)的運(yùn)行結(jié)果分別是什么

因此,我在這里加入一個(gè)alert語(yǔ)法彈出這幾個(gè)參數(shù)的運(yùn)行結(jié)果


加入這一句
#知道你們懶了
alert(JSON.stringify(i0x)+"=="+bqv4z(["流淚", "強(qiáng)"])+"=="+bqv4z(QI7B.md)+"=="+bqv4z(["愛(ài)心", "女孩", "驚恐", "大笑"]))

第一步丰榴,我們找到JS地址中那個(gè)core c245e96...的地址四濒,我們瞧瞧职辨,是在s3.music.126/web/s里面。

然后我們打開(kāi)小葉壺



如果你找不到這個(gè)地方,或者顯示unknown腾供,不用懷疑,你一定是小葉壺哪里設(shè)置出問(wèn)題了宏赘,趕緊去解決吧察署!

接下來(lái)是重點(diǎn)

對(duì)著這個(gè)core的JS文件,右鍵脐往,最下面有個(gè)Map Local,點(diǎn)開(kāi)彈出這個(gè)界面扳埂,把我們修改好的JS文件更改進(jìn)去阳懂,確定。

我們?cè)偎⑿乱幌禄鸷?yè)面

彈出參數(shù)內(nèi)容

你會(huì)發(fā)現(xiàn)這幾個(gè)參數(shù)對(duì)應(yīng)的內(nèi)容都顯示出來(lái)了巷燥,我把原彈框復(fù)制出來(lái)缰揪,然后分割

{"rid":"R_SO_4_478106252","offset":"20","total":"false","limit":"20","csrf_token":""}==010001==00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7==0CoJUm6Qyw8W8jud

我這里給的是第二頁(yè)的參數(shù)葱淳,因?yàn)榈?頁(yè)第一參數(shù)不具代表性赞厕,這個(gè)東西,只要你做多了你就下意識(shí)明白僵驰,我也很難說(shuō)明唁毒。

規(guī)整化后浆西,你就會(huì)發(fā)現(xiàn)這幾個(gè)參數(shù)分別是

第一參數(shù):{"rid":"R_SO_4_478106252","offset":"20","total":"false","limit":"20","csrf_token":""}
第二參數(shù):010001
第三參數(shù):00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
第四參數(shù):0CoJUm6Qyw8W8jud

好了顽腾,其實(shí)我說(shuō)到這里,大家就可以接著看網(wǎng)上的破解結(jié)果久信,因?yàn)槲矣X(jué)得說(shuō)到這里已經(jīng)非常明白了裙士,2、3桌硫、4是實(shí)參啃炸,這些數(shù)據(jù)不會(huì)變,變的是第一個(gè)膀钠,第一個(gè)傳入的都是些什么肿嘲,如果你還沒(méi)懂恒界,真的枉寫(xiě)那么多爬蟲(chóng)了,接下來(lái)該怎么做涩拙。網(wǎng)上已經(jīng)提供了非常多的思路耸采。

這里說(shuō)漏了個(gè)東西虾宇,我們還要看windows.asrsea是什么東西,大家搜索關(guān)鍵字旭贬,然后在上面可以看到定義的一個(gè)變量window.asrsea = d


windows.asrsea
windows.asrsea = d

那么d又是什么鬼


d函數(shù)

稀轨,然后你會(huì)發(fā)現(xiàn)奋刽,d函數(shù)返回的就是encSecKey和encText,然后大家要想清楚這個(gè)問(wèn)題肚吏,我們?cè)谥岸x了windows.asrsea的四個(gè)變量狭魂,然后他說(shuō)windows.asrsea = d

那4個(gè)變量分別就是對(duì)應(yīng) d,e,f,g

關(guān)于encText趁蕊,他要的是d,g兩個(gè)參數(shù),還有個(gè)i是己,當(dāng)然你問(wèn)b又是什么任柜,這些我們都不要去管宙地,這一定是某種加密技術(shù),我們現(xiàn)在只需要知道他傳入的是什么參數(shù)就行参袱。


那么還有一個(gè)i,又是啥抹蚀?
上面定義了企垦,i =a(16)
a又是啥?



a呢郑现,其實(shí)就是一個(gè)16位長(zhǎng)度的隨機(jī)數(shù)
說(shuō)完接箫,那么encText里面含有什么呢
就是d+g+i
所以encSecKey同理:

params:第一參數(shù) + 第四參數(shù) + 16位長(zhǎng)度的隨機(jī)數(shù)

encSecKey:16位長(zhǎng)度隨機(jī)數(shù) + 第二參數(shù) + 第三參數(shù)

也就是說(shuō)encSecKey其實(shí)是個(gè)常量朵诫,隨便拷貝一個(gè)data里面的數(shù)據(jù)直接用就完事了拗窃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末随夸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驼修,更是在濱河造成了極大的恐慌诈铛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異焕毫,居然都是意外死亡邑飒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)县匠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乞旦,“玉大人腔召,你說(shuō)我怎么就攤上這事∏阻耄” “怎么了客峭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵抡柿,是天一觀(guān)的道長(zhǎng)洲劣。 經(jīng)常有香客問(wèn)我课蔬,道長(zhǎng)郊尝,這世上最難降的妖魔是什么流昏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任况凉,我火速辦了婚禮,結(jié)果婚禮上闷营,老公的妹妹穿的比我還像新娘膛锭。我一直安慰自己,他們只是感情好莫杈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布筝闹。 她就那樣靜靜地躺著腥光,像睡著了一般武福。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上平痰,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天宗雇,我揣著相機(jī)與錄音莹规,去河邊找鬼。 笑死舞虱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幼苛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼配并,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼高镐!你這毒婦竟也來(lái)了嫉髓?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤梧油,失蹤者是張志新(化名)和其女友劉穎儡陨,沒(méi)想到半個(gè)月后量淌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胚股,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年琅拌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了财忽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泣侮。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖漏益,靈堂內(nèi)的尸體忽然破棺而出深胳,到底是詐尸還是另有隱情舞终,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布余爆,位于F島的核電站夸盟,受9級(jí)特大地震影響上陕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亚隅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一枢步、第九天 我趴在偏房一處隱蔽的房頂上張望渐尿。 院中可真熱鬧,春花似錦隘擎、人聲如沸凉夯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春忙厌,著一層夾襖步出監(jiān)牢的瞬間江咳,已是汗流浹背歼指。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工东臀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓赁濒,卻偏偏與公主長(zhǎng)得像拒炎,于是被迫代替她去往敵國(guó)和親挨务。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容