Python实现QQ音乐爬取下载最新可用

很久没有跟新博客了,最近心血来潮,写一篇爬取qq音乐的博文,我们这里用到的是现在最热门的语言Python。
接下来我们来梳理整个爬取流程。
找到音乐文件的下载链接 分析下载链接中的参数 在网页请求的响应中寻找参数的位置 获得参数拼接了解下载音乐 我们首先打开网页,搜索歌手薛之谦,得到对应的歌单,任意点击一首歌进入player页面,然后点击播放打开媒体,这个时候就弹到了另外一个界面,而我们的音乐文件的链接就是从这里获得,进去浏览器开发者模式,进行下步操作:
Python实现QQ音乐爬取下载最新可用
文章图片

通过选择媒体过滤点多余信息,这里我门就得到了音乐文件的下载地址:http://isure.stream.qqmusic.qq.com/C400003Y1nX31eQZCg.m4a?guid=2683420628&vkey=C45BCF7E486CC35AF60C2B478411DE1D52DD9518908C8519E563DB5B53984C56E22C331D4E192743A513D8387BFBB2DAFE0369D6C370945E&uin=0&fromtag=66
接下来就是分析链接的参数。
Python实现QQ音乐爬取下载最新可用
文章图片
这里我们得到文件名C400的后缀和vkey参数是变化的,其他的都是固定的。值得注意的是,有些地方的资源的爬取链接中有很多无用参数,我们可以将链接覅只到浏览器挨个验证,得到uinhe fromtag这两个参数是无用的,可以任意取值,guid这个参数固定却不能变。
于是我们接下来得到那两个可变参数就可以了,于是我再次寻找在此界面输入参数vkey,找到了对应的请求:https://u.y.qq.com/cgi-bin/musicu.fcg?callback=getplaysongvkey5909770877130106&g_tk=5381&jsonpCallback=getplaysongvkey5909770877130106&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&data=https://www.it610.com/article/{“req”:{“module”:“CDN.SrfCdnDispatchServer”,“method”:“GetCdnDispatch”,“param”:{“guid”:“2683420628”,“calltype”:0,“userip”:""}},“req_0”:{“module”:“vkey.GetVkeyServer”,“method”:“CgiGetVkey”,“param”:{“guid”:“2683420628”,“songmid”:[“001ndJe947wlaP”],“songtype”:[0],“uin”:“1484232187”,“loginflag”:1,“platform”:“20”}},“comm”:{“uin”:1484232187,“format”:“json”,“ct”:24,“cv”:0}}
Python实现QQ音乐爬取下载最新可用
文章图片
然后我们在播放另外一首歌曲,我们再来分析该请求的链接参数,这里只需要的到songmid这个参数就可可以了,于是我们要去找这个参数。
功夫不负有心人,在歌单界面找到了对应的json数据,获取链接如下:
https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=62731321716932536&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=薛之谦&g_tk_new_20200303=5381&g_tk=5381&jsonpCallback=MusicJsonCallback6388440119570588&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0
很明显这里的参数w就是我们要输入搜索的,到这里我们就分析完毕,开始写代码了,下面给出代码块:

import requests import time import json import random url_music_info = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp?" \ "ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=70661252997214154&" \ "t=0&aggr=1&cr=1&catZhida=1&lossless=0&" \ "flag_qc=0" \ "&p=1&" \ "n=4" \ "&w={}" \ "&g_tk_new_20200303=352421221&" \ "g_tk=352421221&jsonpCallback=''&" \ "loginUin=0&hostUin=0&" \ "format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0" # 上面的n参数表示一次性获取的歌曲数目可以手动更改 param_vkey= {"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch", "param":{"guid":"2683420628","calltype":0,"userip":""}}, "req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey", "param":{"guid":"2683420628","songmid":["0040bgkV4BzIEi"],"songtype":[0], "uin":"0","loginflag":1,"platform":"20"}}, "comm":{"uin":0,"format":"json","ct":24,"cv":0}}url_vkey_get = "https://u.y.qq.com/cgi-bin/musicu.fcg?callback=“”&g_tk=352421221&jsonpCallback=getplaysongvkey7281977218930408&loginUin=1484232187&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&data="https://www.it610.com/article/#音乐下载网址 url_music_downlaod="http://isure.stream.qqmusic.qq.com/{}" search_name = input('请输入你喜欢的歌手名字:') headers = [ {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1)'' AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/86.0.4240.111 Safari/537.36'}, {'User-Agent': "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"}, {'User-Agent': "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)"}, {'User-Agent': "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)"}, {'User-Agent': "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)"}, {'User-Agent': "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6"}, {'User-Agent': "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1"}, {'User-Agent': "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0"}, {'User-Agent': "Mozilla/5.0 (X11; Linux i686; U; ) Gecko/20070322 Kazehakase/0.4.5"}]# 获取歌单数据 music_info_json = requests.get(url_music_info.format(search_name),headers=random.choice(headers),timeout=5).text#去掉字符串多余的字符得到json数据 music_info_json = music_info_json.replace(music_info_json[0:9], '') music_info_json = music_info_json.replace(music_info_json[-1], '') #打印json数据 # print(music_info_json) # 转化字典 music_dict = json.loads(music_info_json) #获取字典中歌单列表 music_list = music_dict["data"]["song"]["list"] # 获取列表中的歌曲id,名字,下载路径以字典形式存入下列表 music_info_List = [] for i in range(0,len(music_list)): time.sleep(random.randint(1, 3)) print('正在解析地址{}....'.format(music_list[i]["name"])) # 定义存单个歌曲参数的字典 single_music = {} song_id = music_list[i]['mid'] # 将获取的id放入请求参数中来获取下载链接 param_vkey['req_0']['param']['songmid'] = [song_id] # 一定要将我们分析定义出来的字典序列化后加入到链接参数中才会得到服务器正确响应,vkey_text是字典 vkey_text = requests.get(url_vkey_get+json.dumps(param_vkey),headers=random.choice(headers),timeout=5).text #注意下面download_purl_list是列表 download_purl_list = json.loads(vkey_text)['req_0']['data']['midurlinfo'] single_music['download_purl'] = download_purl_list[0]['purl'] single_music["name"] = music_list[i]["name"] music_info_List.append(single_music)# #打印歌曲信息 print(music_info_List) for i in music_info_List: #拼接下载链接 download_url = url_music_downlaod.format(i["download_purl"]) print("正在下载歌曲{}...".format(i["name"])+'下载地址为') print(download_url)with open(("./images/" + '{}'+'.m4a').format(i["name"]), "wb") as f: f.write(requests.get(download_url,headers=random.choice(headers),timeout=5).content) print("{}下载完毕。".format(i["name"])) print() time.sleep(random.randint(1,3))

【Python实现QQ音乐爬取下载最新可用】运行代码,点击控制台的链接,得到音乐文件:
Python实现QQ音乐爬取下载最新可用
文章图片

这里特别注意,以上代码只能爬取免费音乐,由于本人没有会员,就没有研究付费音乐。

    推荐阅读