ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python爬虫-QQ音乐下载(详解)

2021-04-14 21:54:25  阅读:282  来源: 互联网

标签:QQ 22 Python 22% 爬虫 3A% json music 2C%



目录


前言

一直想下点歌,今天就对QQ音乐下手了,分析了半天的地址,发现了规律,但就是找不到有关信息,所以只能请教大神,在大神那我找到了歌曲的API地址,一下解决了我的难题,所以我这次的成功也是站在巨人的肩膀上。

API奉上:

https://u.y.qq.com/cgi-bin/musicu.fcg?format=json&data=%7B%22req_0%22:%7B%22module%22:%22vkey.GetVkeyServer%22,%22method%22:%22CgiGetVkey%22,%22param%22:%7B%22guid%22:%22358840384%22,%22songmid%22:%5B%22001X0PDf0W4lBq%22%5D,%22songtype%22:%5B0%5D,%22uin%22:%221443481947%22,%22loginflag%22:1,%22platform%22:%2220%22%7D%7D,%22comm%22:%7B%22uin%22:%2218585073516%22,%22format%22:%22json%22,%22ct%22:24,%22cv%22:0%7D%7D

我们需要注意的就是API中加粗的部分,每首歌曲都有不同的songmid,输入哪首歌曲的songmid就可以得到哪首歌曲的下载地址,所以我们要做的就是找到歌曲的songmid。

1.搜索歌曲,获取歌曲的songmid

我们先打开控制台,在搜索框中输入我们想听的歌曲,按回车后会看到一个文件

在这里插入图片描述

打开后,有会看到有一个列表

在这里插入图片描述

我们可以发现,列表中的项数和我们搜索到的歌曲的数量一致,其实列表中的每一项对应的就是我们搜索到的每首歌曲,然后我们打开一项,查看详细信息

在这里插入图片描述

可以发现有一个mid的属性,试了一下,将他带入到API中,确实得到了这首歌曲的下载地址,所以这就是我们想要的。

2.获取下载地址

找到歌曲的songmid后,将songmid带入到API中,在网页中打开后看到以下信息
在这里插入图片描述

这里我们发现不了什么,所以在控制台中查看

在这里插入图片描述

在这里插入图片描述
我们可以查看每首歌曲的下载地址
在这里插入图片描述

我们可以发现,歌曲的播放地址为:

https://isure.stream.qqmusic.qq.com/ + purl

所以我们可以遍历我们搜索的歌曲列表中的每首歌曲,以此找到每首歌曲的下载地址,就可以实现将我们搜索的歌曲批量下载,代码部分:

    music_list = dict_html["data"]["song"]["list"]  #获取搜索到的所有歌曲的列表

for music in music_list:per_songmid = music["mid"]  #歌曲的songmidper_songname = music["name"]  #歌曲名称singer = music["singer"][0]["name"]  #歌手名称music_document_url_part = "https://u.y.qq.com/cgi-bin/musicu.fcg?format=json&data=%7B%22req_0%22%3A%7B%22module%22%3A%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%22358840384%22%2C%22songmid%22%3A%5B%22{}%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%221443481947%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A%2218585073516%22%2C%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D".format(per_songmid)music_document_html_json = requests.get(music_document_url_part).text
    music_document_html_dict = json.loads(music_document_html_json)  #将文件从json格式转化为字典格式music_url_part = music_document_html_dict["req_0"]["data"]["midurlinfo"][0]["purl"]  #歌曲下载地址的后部分if music_url_part == "":  #有的没有版权的歌曲应该是没有地址的 所以为空的话 就直接重新循环下一首就行了continuemusic_url = "https://isure.stream.qqmusic.qq.com/" + music_url_part  #歌曲完整下载地址

3.自动搜索歌曲

我们查看第一张图片中文件的地址
在这里插入图片描述
地址:https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=55043609442258168&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%E5%A4%8F%E5%A4%A9%E7%9A%84%E9%A3%8E&g_tk_new_20200303=5381&g_tk=5381&loginUin=229554158&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0

只是地址进行编码了,我们解码看看

解码后:

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=55043609442258168&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&loginUin=229554158&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0

我们可以发现里面的关键字,就是加粗的部分,我们可以改为我们想要搜索的歌曲名,访问后就可以得到所有歌曲。
在这里插入图片描述
所以我们可以通过改变关键字的方式来实现自动搜索我们想要找的歌曲,代码部分:

search_url = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.center&searchid=52176551238941872&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&loginUin=229554158&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0".format(name)json_html = requests.get(search_url).text  #json格式转化为字典格式 转化的类型必须是字符串型dict_html = json.loads(json_html)

4.完整代码

前面主要是分析一下,现在将完整代码奉上,基本都有注释,结合上面每段代码所实现的功能就很容易看懂了。

实现的功能主要是:将我们搜索的歌曲的所有版本都下载下来(其中有的歌曲没有版权应该是没办法下载,见谅)

def allmusic(name):headers = {"Cookie": "eas_sid=h1u5a6D7N0u089l4P8g4S1o9N5; pgv_pvi=1399294976; pgv_pvid=3522250322; RK=RaCE+Qw87C; ptcz=645f699f302818f2aa4fb78a5bf7f75fd0d90f1c95db5a5d0acb695283fdc8b7; tvfe_boss_uuid=306cd91a9af78b43; LW_uid=11f5K7a8I9K0K2E7d6G2B4q7P1; LW_sid=K1o518v1X5U1h0o5J6i4x9g0n9; o_cookie=229554158; pac_uid=1_229554158; uin_cookie=o0229554158; ied_qq=o0229554158; ptui_loginuin=2863778213; luin=o0229554158; lskey=00010000161fb2266a89bdbedc615f48e2b88d65a280a1be4207429dee5c429e0fcb7e0da641297e832f0555",   "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}search_url = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.center&searchid=52176551238941872&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&loginUin=229554158&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0".format(name)json_html = requests.get(search_url).text  #json格式转化为字典格式 转化的类型必须是字符串型dict_html = json.loads(json_html)file_address = "D:/Pycharm文件/网络爬虫/QQ音乐"music_list = dict_html["data"]["song"]["list"]  #获取搜索到的所有歌曲的列表for music in music_list:per_songmid = music["mid"]  #歌曲的songmidper_songname = music["name"]  #歌曲名称singer = music["singer"][0]["name"]  #歌手名称music_document_url_part = "https://u.y.qq.com/cgi-bin/musicu.fcg?format=json&data=%7B%22req_0%22%3A%7B%22module%22%3A%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%22358840384%22%2C%22songmid%22%3A%5B%22{}%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%221443481947%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A%2218585073516%22%2C%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D".format(per_songmid)music_document_html_json = requests.get(music_document_url_part).text
        music_document_html_dict = json.loads(music_document_html_json)  #将文件从json格式转化为字典格式music_url_part = music_document_html_dict["req_0"]["data"]["midurlinfo"][0]["purl"]  #歌曲下载地址的后部分if music_url_part == "":  #有的没有版权的歌曲应该是没有地址的 所以为空的话 就直接重新循环下一首就行了continuemusic_url = "https://isure.stream.qqmusic.qq.com/" + music_url_part  #歌曲完整下载地址music_url_content = requests.get(music_url,headers=headers).content  #将歌曲下载地址转化为二进制格式music_file_name = per_songname + "---" + singer + ".mp3"  #歌曲保存的名称  歌曲名+歌手名try:if not os.path.exists(file_address):os.mkdir(file_address)if not os.path.exists(file_address + music_file_name):print("正在下载     %s" % music_file_name)with open(file_address + music_file_name,"wb") as f:  #保存语句f.write(music_url_content)print(music_file_name,"   下载成功")else:print(music_file_name,"   文件已存在")except:print("下载失败")allmusic("汪苏泷")

5.结语

我也是新手,有很多问题,代码肯定也有很多不足之处,也请大神们多多指点,我们一起进步呀。

喜欢或者对你有所帮助的话,也请多多支持呀。

标签:QQ,22,Python,22%,爬虫,3A%,json,music,2C%
来源: https://blog.51cto.com/u_15166912/2706773

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有