QQ音樂MP3下載!
QQ音樂MP3下載
沒錯本次寫的內(nèi)容的對象是我們熟知的QQ Music。
本篇文章涉及內(nèi)容包括:Python,爬蟲,json解析,request 庫的使用
緣起
前幾天刷B站無意中又刷到了一首神曲,“I Want My Tears Back”,挺好聽的。聽了幾遍后便尋思著能不能把這歌給下到手機上拿來當鬧鐘的,聽過的同學應該知道這歌有多提神,哈哈哈~~~
沒聽過的同學可以點擊文章上方的音樂,感受一下下。
動手分析
接下來,當然要選擇一下從哪個平臺下搞這首歌回來啦。網(wǎng)易云音樂和QQ音樂,選擇哪個?那就從網(wǎng)易云入手吧,畢竟用的多些,接著便去網(wǎng)易云一頓操作,此處省略1000字描述。發(fā)現(xiàn),哎呦,這網(wǎng)易云……不好搞呀。所以先不管了,看一下QQ音樂的情況先。
F12大法一開,QQ音樂就先給我來了個驚喜,大大符號圖標傾情相送。對比云村的就沒有啦。
撇開這些不關(guān)鍵的東西不說了,接下來就是搜索一首歌。
這個時候,先把控制臺切到network欄,這個時候,你會發(fā)現(xiàn)左下角有很多請求鏈接。請求各種各樣的內(nèi)容,這個時候,這些東西對我們都是沒用的,是吧。我們要的是我們請求搜索那一瞬間他發(fā)出去的數(shù)據(jù)。所以,為了避免無關(guān)數(shù)據(jù)的干擾,建議點擊左上角的清空把記錄清空先。然后右上角勾上disable cache,避免緩存使我們看不到我們要的數(shù)據(jù)。
ok,這個時候我們輸入我們要查的歌,I Want My Tears Back。我們已經(jīng)可以看到有東西已經(jīng)發(fā)出去并返回回來了。就是這個鏈接
https://c.y.qq.com/splcloud/fcgi-bin/smartbox_new.fcg?is_xml=0&key=I Want My Tears Back&g_tk=1419336673&loginUin=824368xxx&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0
我們觀察一下,這里面的參數(shù),key就有I Want My Tears Back這個歌名了,再看一下返回數(shù)據(jù)。是一個json數(shù)據(jù),有很多內(nèi),我們可以很容易看出了數(shù)據(jù)包含了 專輯、mv、歌手、歌曲 這四大區(qū)域。我們關(guān)注歌曲這個欄,在count 中已經(jīng)表明找到了兩首符合度最高的歌曲。一首是Nightwish的一首是Hok-key的。因為我想要的就是 夜愿 這個版本的,所以我們就默認第一首出現(xiàn)的就是我們要下的歌曲哈。
這個時候,拿到這些數(shù)據(jù)有什么用呢?歌曲鏈接還沒不知道怎么構(gòu)造呀。。。
先別急,我們看看歌曲鏈接長啥樣。然后…………
好尷尬呀,有木有,這,這誰忍得住呀?所以,機智的我打開了另外一首歌……
瞬間右邊記錄出來了一大堆,沒錯是一大堆東西……但是,控制臺有分類呀,不慫。選擇media分類,就給我們過濾出了那幾個鏈接。
沒辦法了,逐個點擊。1分鐘過后,I got it.最后那個鏈接就是歌曲鏈接。
https://isure.stream.qqmusic.qq.com/C400000JHuWh4fOBxD.m4a?guid=8665097290&vkey=A78C373DCB421D9DA3B1C3A87979A32A6062159F032C2D44C83BDD8D9D1F717B429F6C92A6C2720A1DB18AC835D4E6FCD409D6F0D0CE6F21&uin=7642&fromtag=66
可以清楚看到有幾個關(guān)鍵參數(shù)。guid、vkey、uin、fromtag,我們先暫且不管那個參數(shù)可以省略好吧。先看看可以從哪里找到這幾個參數(shù)……又得看鏈接的返回值了(此處說明,可以在控制臺點擊response標簽查看返回值,你只要按↓鍵就OK了)。在漫長的遍歷過程中,我注意到了一個鏈接的內(nèi)容十分不一樣的,不相同的,很多很多。直覺告訴我,就是這個鏈接了。
拿去做一下URL解碼后,咋一看一頭霧水。不信你看一下下?
接合歌曲鏈接,這個請求鏈接,搜索請求結(jié)果,這三個內(nèi)容。其實不難發(fā)現(xiàn),songmid 這個參數(shù)是關(guān)鍵。
所以,我們這個時候基本就以及厘清下載音樂的步驟以及思路了。首先,請求搜索某一首歌,然后或者到song mid 接著song mid 去請求服務器拿到這首歌的播放鏈接。接著用request請求數(shù)據(jù)回來再用二進制保存就OK啦。
代碼寫起來
導入需要用到的json庫和requests庫。
構(gòu)造一個類,downloadMusic,初始化一個headers,做個最簡單的反爬。
寫run方法,將上面的思路實現(xiàn)出來。請求回數(shù)據(jù)后就用json.loads方法加載json數(shù)據(jù)。逐步逐步請求服務器,填充需要填的數(shù)據(jù)。
最后拿到鏈接的URL后,就easy了,用requests請求資源回來后。用.content,不要用.text。又人問過我這兩個方法的區(qū)別。
簡單來說,content拿到的數(shù)據(jù)是字節(jié),調(diào)試打印出來你會發(fā)現(xiàn)數(shù)據(jù)前面會有個b',text的話,就是一個字符串了。
因為我們要保存歌曲,就肯定要用字節(jié)保存好,用wb方式打開,然后寫進去后便關(guān)閉即可。代碼貼在下面。
至此寫完收工,可以美滋滋地下載我們要的歌了。有了它還怕什么鈴聲找不到自己喜歡的問題嗎?
# -*- coding: utf-8 -*-
# @Time : 10/10/2018 9:31 PM
# @Author : MARX·CBR
# @File : __init__.py
import requests
import json
class downloadMusic:
def __init__(self):
self.headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0',
}
self.name='I Want My Tears Back'
def run(self,sn):
self.name=sn
session=requests.session()
firstjsonurl='https://c.y.qq.com/splcloud/fcgi-bin/smartbox_new.fcg?is_xml=0&format=jsonp&key={}&g_tk=5381&jsonpCallback=SmartboxKeysCallbackmod_top_search1467&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0'.format(self.name)
r=session.get(firstjsonurl).text
print(type(r))
print(r[39:-1:])
myjson=json.loads(r[39:-1:])
mid=myjson['data']['song']['itemlist'][0]['mid']
print(mid)
searchurl='''https://u.y.qq.com/cgi-bin/musicu.fcg?callback=getplaysongvkey2236996910208997&g_tk=5381&jsonpCallback=getplaysongvkey2236996910208997&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"8665097290","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"8665097290","songmid":["'''+mid+'''"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":20,"cv":0}}'''
r=session.get(searchurl).text
print(r)
songjson=json.loads(r[32:-1:])
print(songjson)
header=songjson['req_0']['data']['sip'][0]
two=songjson['req_0']['data']['midurlinfo'][0]['purl']
songurl=header+two
with open("{}.mp3".format(self.name),'wb') as ms:
print(songurl)
raw = session.get(songurl, headers=self.headers)
content=raw.content
if len(content) >500:
ms.write(content)
print("下載成功")
else:
print("下載失敗")
App=downloadMusic()
while 1:
songName=input("請輸入歌曲名字")
App.run(songName)
本文對你有沒幫助呀,喜歡的話,記得留言、點贊、轉(zhuǎn)發(fā)喲。謝謝各位!
歡迎各位關(guān)注我的微信公眾號:敘之亭
