Skr!如何用 Python 爬取中國新說唱熱門歌曲?
作者 | 初一
責編 | 郭芮
之前風靡朋友圈的「skr」流行語把中國新說唱這一節目帶上了熱議高峰,本文就來分析下,如何用Python爬取大受歡迎的說唱歌曲。
首先登錄https://music.163.com/ 網易雲音樂搜索新說唱,打開Chrome的開發工具工具選擇Network並重新載入頁面,找到與評論數據相關的請求即name為web?csrf_token=的POST請求,如下圖所示:
查看該請求的headers我們發現formData包含了兩個參數:params、encSecKey。顯然這兩個參數是經過JS加密的,這就是網易雲反爬蟲的一種策略。如下圖:
我們再來看一下請求的Initiator有個core 2ab1b2b..js。因此我們需要分析一下這個JS,找出formData加密的規則即可。
將JS文件進行格式化,全局搜索params或者encSecKey:
params和encSecKey是從bSC8u這個對象中取的:
而這個對象是由windows.asrsea() 這個方法獲得的,定位到該方法。如下圖所示:
通過分析代碼我們發現d函數才是最終的出口。分析d函數:
通過a(16)函數生成一個長度為16的隨機字元串;
encText這個參數通過兩次調用b(a,b) 函數完成,這個函數的作用為AES加密;
調用 c(i, e, f)得到encSecKey,這個函數的作用是進行RSA加密。
AES加密:AES(Advanced Encryption Standard)對稱加密演算法是一種高級數據加密標準,是美國聯邦政府採用的一種區塊加密標準,可有效抵制針對DES的攻擊演算法。特點是,密鑰建立時間短、靈敏性好、內存需求低、安全性高。
RSA加密:RSA加密演算法是一種非對稱加密演算法。在公開密鑰加密和電子商業中RSA被廣泛使用。到目前為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被解破的。
通過上面分析,除了 i 是一個隨機字元串,我們只需要知道d、e、f、g這四個參數就可以構造請求進行後續操作了。接下來我們進行JS斷點調試。
經過多次調試,我們發現e、f、g這三個值是不變的,唯一改變的是d。再結合上文分析,encSecKey由函數c(i, e, f)得到的,那是不是就意味著encSeckey這個值是不變的呢?
然而,經過代碼測試並不是這樣,要保證encSecKey和params中的隨機字元串(也就是i的值)是一樣的才可以。
首先我們先實現函數a,即生成16位的隨機字元:
其次來實現加密參數的生成(說白了就是翻譯JS代碼為Python代碼):
最後參數構造完畢,就可以開始咱們的爬蟲了。
由於RSA是非對稱加密,無法通過encSecKey解密出i,沒有i也就無法解密params,所以也就只能對每個介面進行斷點調試,觀察請求的構造。
搜索歌曲的data為:
查詢歌曲信息的data:
接下來就可以開始寫爬蟲了。分析網頁請求我們發現搜索歌曲的時候響應是在https://music.163.com/weapi/cloudsearch/get/web?csrf_token= 這個請求里響應的:
歌詞信息由 https://music.163.com/weapi/song/lyric?csrf_token=這個請求響應的:
萬事俱備,開始Coding!
運行之後查看資料庫:
現在我們有了Rap歌手的id,從全網爬他們的說唱歌曲還不是so easy?
作者:初一,曾在知名互聯網公司擔任java研發一職,項目帶頭人。18年中旬轉行Python,熱愛爬蟲喜歡折騰新東西。coding與樂趣同在。Talk is cheap,Show me the code.
聲明:本文為作者投稿,版權歸其個人所有。
蘋果手機的微信改版了,
想快速看到CSDN的熱乎文章,
趕快把CSDN公眾號設為星標吧,
打開公眾號,點擊「設為星標」就可以啦!
安卓手機的用戶,
點擊公眾號右上角小人,就可以置頂啦。
2018 AI開發者大會
只講技術,拒絕空談
2018 AI開發者大會首輪重磅嘉賓及深度議題現已火熱出爐,掃碼搶「鮮」看。國慶特惠,購票立享5折優惠!
※漫畫:什麼是時間複雜度?
※為什麼 Python 4.0 會與 Python 3.0 不同?
TAG:CSDN |