

Github源碼在這里
代碼的效果其實(shí)和上一篇網(wǎng)易云音樂的爬取是一模一樣的
先搜索歌名或者歌手 找到想要下載的編號(hào) 輸入編號(hào)下載即可
相比于網(wǎng)易云音樂 QQ音樂簡直太渣了(專指加密)
第一點(diǎn):QQ音樂都是get請求 沒有post請求 不需要傳入一些奇葩的參數(shù) 所以比較簡單
第二點(diǎn):QQ音樂下載過來是m4a格式 而網(wǎng)易云是MP4 (源文件就是這樣)? 只能說網(wǎng)易云更良心 m4a格式犧牲了音質(zhì) 節(jié)省了空間 當(dāng)然 我這樣的木耳也聽不出來啥區(qū)別 就是MP4常見一點(diǎn)
第三點(diǎn):QQ音樂沒有使用復(fù)雜的RSA、AES加密算法 下面是TFBOYS的《喜歡你》的文件地址 復(fù)制打開 就是音頻文件 vkey就是加密的參數(shù) 看似這個(gè)串?dāng)?shù)字加密過 挺難獲得 其實(shí)也是寫在json里的 直接拿 貼上就行了
http://dl.stream.qqmusic.qq.com/C400001VySE80MYPrC.m4a?vkey=A43C8A65EED5DD07B6F5BF0DFDA934FBA0993658AF76F1C70693F679972D0B074E5FC3D91E480605D99AFE6D5CEEDD6BD3722C78E3505D72&guid=6800588318&uin=0&fromtag=66
PS:為什么拿這首歌舉例子 純粹是搜索里第一個(gè) 順手就點(diǎn)了
下面詳細(xì)講解了QQ音樂的抓取
1.先進(jìn)入搜索頁搜索 仍以“喜歡你”為例

2.F12 F5 抓包 一下子就找到目標(biāo)文件(其實(shí)花了好久 一個(gè)一個(gè)找下來的) 基本就是json文件 不是json 一般一看就不是

點(diǎn)擊Headers 獲得地址 這個(gè)地址非常非常的長 其實(shí)就是一些參數(shù)的拼接 然后就會(huì)沒有用的參數(shù)是可以參數(shù)的 一個(gè)一個(gè)刪掉測試下內(nèi)容會(huì)不會(huì)發(fā)生變化 沒用的就扔掉

刪減后的url變成https://c.y.qq.com/soso/fcgi-bin/client_search_cp?aggr=1&cr=1&p=1&n=20&w=%E5%96%9C%E6%AC%A2%E4%BD%A0
看吧 很多參數(shù)都沒用 有用的就那么幾個(gè) 其中說明下w參數(shù) w就是搜索的內(nèi)容 可作任意替換
尤其是中文搜索要做編碼處理 quote()函數(shù)一下

3.這樣就獲得每首歌曲的詳細(xì)信息
這里舉例打印出歌名、作者、專輯、時(shí)長
這里有兩個(gè)細(xì)節(jié)
一:作者(歌手)有多歌手的情況 這里首先遍歷所有的歌手信息 獲取后 用join()串在一起
二:數(shù)據(jù)中的歌曲時(shí)長是秒單位的 這里使用divmod函數(shù)轉(zhuǎn)化后X分X秒

4.拿到搜索的列表 定位某一首歌的url 找之前提過的下載地址
搜索列表中隨便點(diǎn)擊一首歌 進(jìn)入 點(diǎn)擊播放 進(jìn)入音樂播放器 F12 F5 抓包
找到了之前提到過的音頻文件的url 發(fā)現(xiàn)關(guān)鍵參數(shù)vkey vkey是從哪里的來的

找啊找啊 終于找到了? 就在這擺著? 這也太太太放心了? 網(wǎng)易云好歹加了好幾層密

同樣點(diǎn)擊Headers 又是一非常非常非常長的url? 刪刪刪 刪掉那些沒有的參數(shù)
最后精簡為
https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&cid=205361747&songmid=001VySE80MYPrC&filename=C400001VySE80MYPrC.m4a&guid=6800588318

同樣的方法? 拿好幾首歌來測試下 觀察哪些參數(shù)發(fā)生了變化
其實(shí)就只變換一個(gè)參數(shù)songmid ,filename參數(shù)值就是songmid前綴增加C400
構(gòu)造通配表達(dá)式
https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&cid=205361747&songmid=%s&filename=C400%s.m4a&guid=6800588318' % (? media_mid, media_mid)
midia_mid從何而來? 之前不是找過歌曲的詳細(xì)信息 這里什么沒有啊? 果然在里面 獲取即可
總結(jié)下 就是先獲得media_mid 構(gòu)造一個(gè)url 得到vkey 再使用vkey構(gòu)造第二個(gè)url 即可獲取音頻文件的源地址了

PS:第二個(gè)url不要像之前操作一樣 再刪掉沒用的參數(shù) 力求精簡 這里實(shí)測遇到一個(gè)小坑
? ? ? ? 測試的時(shí)候 確實(shí)刪掉了uin和fromtag這兩參數(shù) 網(wǎng)址是能打開播放的 但是爬蟲requests的時(shí)候 下載過來 音頻已損壞 無法播放? 懷疑自己 懷疑人生 最后參數(shù)不刪除 放回去 終于下載的音頻能播放
5.最后寫個(gè)run函數(shù) 就可以哪首想聽 搜哪首


PS:細(xì)節(jié) 如果歌曲已下架 返回的音頻文件的vkey是NULL 所以要加一個(gè)判斷 如果vkey是null的話 就不用構(gòu)造url了? 如果vkey是null不做判斷的話 會(huì)繼續(xù)構(gòu)造下載url 而這個(gè)url里的vkey是null 下載過來 啥的沒有
END
Github源碼在這里
最后就是愉快的 哪首想聽 搜哪首 下哪首
