搜索关键字下载QQ音乐

本案例所用到的模块:
import requests
import json
import os
from jsonpath import jsonpath
from urllib.request import urlretrieve
from requests.exceptions import RequestException

前言:

因为腾讯音乐占有中国总曲库的90%,所以往日红火一时的网易云音乐,因为歌曲版权太少的缘故,已经不复当年了,喜欢听歌的小伙伴们也纷纷从网易云音乐转投到QQ音乐下听歌了,我也是这其中的一员。可是QQ音乐里面的歌曲很多不是让你听个开头,就是要你交钱,很不爽 ,所以本案例就是利用搜索关键字(歌手或者歌名)把自己喜欢的歌曲下载到本地,这样想啥时候听就啥时候听。其实关于下载QQ音乐的案例已经很多了,有通过QQ音乐下载接口的,有JS解密后下载的,我这个案例是通过找需要的参数进行下载的,可能没有前两种方法稳定,但是经我这段时间的测试,至今没出现问题,所以就想给大家分享出来,话不多说…

一、分析网页

打开网页https://y.qq.com/,在搜索栏里面输入自己喜欢的歌曲名称或者歌手名字,点击搜索,网站会给我们跳转到需要搜索到包含这个关键字的歌曲信息网页,如图:

本文就拿最近很火的笑纳这首歌来做演示:

点击自己想听的歌曲,会提示你需要登录QQ号才能听,我们就登录自己的QQ号,然后会跳转到播放歌曲的页面,


我们现在先不要点击播放,先按F12键或者右键检查,调出开发者模式,定位到network下的media选项,现在点击播放按钮,就可以看到media下多了好几个网址,然后找一个不是红色字体的网址点开,如图:

可以复制这个网址到浏览器,会自动下载下来一个.m4a的文件,点开可以听一下,其实就是这首在线播放的歌曲,现在知道了怎么找到歌曲了并下载下来,可是这只是一首歌,我们要实现的是搜索关键字然后自动下载需要的歌曲,像上面这样操作显然不是我们想要的。现在开始分析一下这个歌曲吧,红色框中的那一串字符我们就叫它song_id,它是一个动态变化的,所以必须找到包含这个字符的网页,我们可以通过搜索来查找,最终定位到XHR这个选项下经过分析,找到红框下面这个地址:

可以看到这个网址很长,可以看看它的params参数是什么,如图:

经过我多次尝试,这些参数很多都不重要的,但是有一个参数是很重要的,就是data这个参数很重要,可以看出它是个像字典一样的字符串,里面有一个songmid键值对,这个值就是请求这个网页的关键,需要找到这个songmid才能请求这个网页,下面我们在来看看这个网页里面都有什么,经过分析,

这个网页里面有包含我们需要的歌曲的网址,歌曲的原始名字,虽然网址不是完整的,但是可以通过拼接把它构建成完整的网址,然后我们在对这个网址发送请求,下载出我们需要的歌曲。现在就说说我的思路,通过搜索页面,找到包含songmid的值的数据的api接口,然后提取出这个数据,携带这个数据请求包含歌曲网址的这个网页,得到真正的歌曲网址,然后下载歌曲。

二、提取网页songmid参数数据

这个包含songmid参数的数据就在搜索页面里面,不过是需要我们耐心的一个个找,这里就不过多赘述找的过程了,直接上代码:

    def parse_url(self, url, param):"""发送请求,获取响应数据的方法笑纳:param url: self.SEARCH_INDEX:param param: getParam():return: 返回响应的数据"""try:response = requests.get(url, params=param, headers=self.headers)if response.status_code == 200:return response.textexcept RequestException:self.parse_url(url, param)def get_musicDate(self, json_str):"""解析需要的数据方法:param json_str: 响应的数据:return: 构建的新的数据列表"""json_data = json.loads(json_str)music_data_list = []for music_data in json_data.get('data').get('song').get('list'):# 歌曲名字song_title = music_data.get('title'),# 歌手名字singer_name = music_data.get('singer')[0].get('title')# 歌曲MIDsong_mid = music_data.get('mid')music_data_list.append([song_title, singer_name, song_mid])return music_data_list

三、构建params参数

    def get_param(self, mid):"""构建param参数的方法:param mid: 歌曲的MID:return: 返回字典数据"""return {"-": "getplaysongvkey9623999851369811","g_tk": "1495912697","sign": "zzam0olqip2ato3iff4bbad571c0001405a6a15d64b49d458","loginUin": "61079558","hostUin": "0","format": "json","inCharset": "utf8","outCharset": "utf-8","notice": "0","platform": "yqq.json","needNewCode": "0","data": '{"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"7008479702","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"7008479702","songmid":["' + mid + '"],"songtype":[0],"uin":"61079558","loginflag":1,"platform":"20"}},"comm":{"uin":61079558,"format":"json","ct":24,"cv":0}}'}

四、再次请求包含歌曲地址的页面并提取出歌曲地址

    def getMp3_url(self, music_json):"""解析数据的方法:param music_json: 请求到的新的数据:return: 歌曲的一部分数据"""mp3_data = json.loads(music_json)music_url = jsonpath(mp3_data, '$..purl')[0]return music_url

五、保存歌曲

    def save_music(self, music_url, songname, singer_name):"""保存数据的方法:param music_url:真实的歌曲URL地址:param songname: 歌曲的名字:param singer_name: 歌手的名字:return:"""folder_name = 'song'os.makedirs(folder_name, exist_ok=True)urlretrieve(music_url, os.path.join(folder_name,f'{songname}-{singer_name}.mp3'))print('======下载完成======')

六、整个逻辑思路代码

    def run(self):"""实现主要逻辑思路:return:"""# 1.构建新的param参数param = self.getParam()# 2.发送请求,获取响应数据json_str = self.parse_url(self.SEARCH_INDEX, param)# 3.解析出需要的数据列表music_data_list = self.get_musicDate(json_str)# 4.遍历这些数据列表for index in range(len(music_data_list)):print(f'序号:{index} 歌名:{music_data_list[index][0]} 歌手:{music_data_list[index][1]}')# 5.提示输入内容num = int(input('请选择下载歌曲的序号:'))# 6.获取歌曲的midsong_mid = music_data_list[num][2]# 7.再次构建新的param参数params = self.get_param(song_mid)# 8.再次发送请求,获取响应数据music_json = self.parse_url(self.API_URL, params)# 9.解析出需要的数据music_url = self.getMp3_url(music_json)# 10.构建出歌曲的真实URL地址music_url = self.MUSIC_URL + music_url# 11.保存歌曲print(f'======正在下载{music_data_list[num][0]}的{music_data_list[num][1]}======')self.save_music(music_url, music_data_list[num][0], music_data_list[num][1])

最终效果展示:

搜索关键字下载QQ音乐相关推荐

  1. python爬虫实战——运用requests批量下载qq音乐

    python -qq音乐爬取 在学习一段时间后,在视频的讲解下,觉得自己掌握的不错,就开始了这一次的qq音乐的爬取,在爬取的过程中发现了很多问题.知识点掌握的不够,知识点掌握的不熟,例如:正则表达式的 ...

  2. python利用charles爬虫爬取下载qq音乐歌单里的歌曲——多进程

    因为这是我第一个独立实践的爬虫项目,所以这次把思路都放上来了 特别注意,用的是charles,可以拦截查看url 知识点: ·······利用charles分析网页,抓包,得出对应URL ······ ...

  3. 如何免费下载qq音乐 ----ctf学习之php漏洞

    每次听到好听音乐总想下载但是没有办法,收钱,绿钻你懂的,今天教大家一个免费的方法,就是你用手机录音功能录下来ok, 最近刷题,攻防世界的,%20空格,%22双引号:: 3.查找flag http:// ...

  4. QQ音乐for mac~下载歌曲到本地

    造福一下~现在的文件夹地址为/Users/用户名/Library/Containers/com.tencent.QQMusicMac/Data/Library/Application Support/ ...

  5. 雷军:4G 手机已清仓,全力转 5G;QQ音乐播放中途插语音广告引热议;Wine 5.9 发布 | 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦 ...

  6. 基于python实现在线听音乐(QQ音乐)

    在CSDN中,许多的听音乐代码是在用户已有一个音乐的MP3文件的情况下实现自动播放音频.接下来的代码可以实现你说什么音乐,他就放什么音乐. 首先我们来分析一下实现这个功能分为那几步骤. 用户输入歌名/ ...

  7. html实训QQ音乐官网首页制作

    QQ音乐官网首页 html <!DOCTYPE html> <html lang="en"> <head><link rel=" ...

  8. QQ音乐静态页面设计-思路分享和代码

    QQ音乐静态页面设计 布局思路 一. 顶部导航栏设计< Header > 二.内容版块设计< content > 歌单推荐 新歌首发 三.底部版权.外链部分设计< foo ...

  9. Deepin-安装QQ音乐(Windows程序)

    打开命令行,输入: sudo apt-get install wine 安装完成后,下载QQ音乐的安装包 然后安装 示例:wine xx.exe 实例:wine QQMusic.exe 安装完成,启动 ...

  10. python爬虫:爬取QQ音乐歌曲

    描述 可以下载QQ音乐免费音乐和绿钻音乐,但是不能下载付费音乐. 运行程序后会在同级目录自动创建名为:歌曲下载的文件夹,下载的文件将被放置在此文件夹 如果下载的文件大小为1KB,则表示下载失败,这首歌 ...

最新文章

  1. Direct I/O
  2. Django学习笔记之模板渲染、模板语言、simple_tag、母版子版、静态配置文件
  3. UVA11722(见面概率)
  4. Zabbix+shell监控报警任意web
  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)union
  6. Oracle学习计划
  7. python爬取文件归类_python爬取各类文档方法归类汇总
  8. Python案例:房源信息分析
  9. 北京科技大学计算机与通信工程学院计算机科学与技术系导师研究方向,北京科技大学计算机科学与技术系硕士生导师孙昌爱_计算机考研导师...
  10. Map 参数按Key重新排序,重组成String
  11. LaTex的book类型中,目录及chapter前自动插入空白页面
  12. Server.MapPath()用法
  13. 鼠标失灵,但鼠标和USB接口都是好的的情况。
  14. 在Ubuntu安装和使用Anbox完整说明(一种在Linux使用Android应用的方法)
  15. UWP 分享用那个图标
  16. 恶意代码分析实战Lab0701
  17. ubuntu 主题美化和 软件推荐,qq最新版安装
  18. 关于数据分析那些事,看这一文章就够了
  19. 改变自己错误的固有思想和行为(潜意识,如果不主动意识来改变,就会按照固有的潜意识来执行),只有一个办法,要么时刻想着画面,要么时刻语言提醒自己。以文字语言图片来驱动自己。
  20. matlab如何将横轴上的汉字旋转90度,第72节:在液晶屏中把字体顺时针旋转90度显示的算法程序...

热门文章

  1. 香橙派python编程_香橙派4B Python3.7安装OpenCV
  2. postgreSQL 获取当前连接的IP
  3. Filtered off site request to
  4. 推荐几个我收藏且星标的嵌入式技术公众号
  5. 关于yuv rtp 打包_【讲堂】关于KNX编程基本规律
  6. c语言编程樱花树,分形樱花树(画画)
  7. Coolpad(酷派) 进入手机工厂模式
  8. 阿里P9专家:程序员未来职业发展路线
  9. 九爷带你玩转 php单元测试
  10. 毕业设计__系友录ByJavaweb