音乐听到爽!Python爬虫批量下载某Q音乐教程!

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

网络爬虫是当下比较热门的技术之一。在本场chat中我们通过对QQ音乐网站的分析从而实现批量下载某Q音乐,让你从零快速入门python爬虫。

网络爬虫是当下比较热门的技术之一。在本场chat中我们通过对QQ音乐网站的分析从而实现批量下载某Q音乐,让你从零快速入门python爬虫。

通过此案例你将学到:

  1. 最新 Python 环境安装配置;
  2. 获取 某Q 音乐指定歌手或者歌曲的歌名、歌手、专辑名、播放链接等信息;
  3. 使用prettytable格式化爬取到的信息使其更加优美的展示;
  4. 输入歌手或者歌曲信息一键下载;


前两天有小伙伴反映说是爬虫想下载一些某Q音乐。让我出一期教程,今天它来了。首先我们来看看最终效果: 在这里插入图片描述

接下来我们就来看看如何下载自己所喜欢的音乐,哪怕它是vip专享~~

1. 最新 Python 环境安装配置;

  1. 软件安装:https://www.python.org/downloads/
    在这里插入图片描述
  2. 以管理员身份运行安装包。
    在这里插入图片描述
  3. 把我框起来的全部选择,然后点击【Cu…】。
    在这里插入图片描述
  4. 全部勾选,特别是这个pip,点击【Next】。
    在这里插入图片描述
  5. 自己选择安装路径,切记安装路径不要出现中文,然后我在这里还多勾选了一个【Pr…library】。 在这里插入图片描述
  6. 安装完成,点击【Close】。
    在这里插入图片描述
  7. 验证 Python 环境是否安装搭建:Win 下面打开 cmd 窗口(win 键+ R,输入 cmd 回车),在 cmd 窗口中输入 python 命令,回车后显示当前 python 版本即可,即可证明安装成功。
    在这里插入图片描述 到此为止我们的python环境已经搭建好了。

2. 获取 QQ 音乐指定歌手或者歌曲的歌名、歌手、专辑名、播放链接等信息。

  1. 好了分析之词接下来我们进入到今天的主题,QQ音乐的爬取。 qq
  2. 我们可以输入任意的歌手或者音乐来查看浏览器的响应信息从而找到真实的请求链接如下: 5. q
  3. 通过headers找到王也真是请求链接我们其实是直接访问不了的。可以看到这是一个POST请求,而且还携带了一个加密的sign参数。 在这里插入图片描述 在这里插入图片描述
  4. 我们再来发送一个请求来看看它的请求参数,不但不相同而且毫无规律可言。这就涉及到加密问题。 在这里插入图片描述
  5. 但是除此之外我们有一个之前的搜索接口也可以访问: https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w={name}
  6. 可以看到这跟我们刚才看到的内容基本一致的,同样展示十条音乐信息。也可以通过参数自行调整歌曲的数目和页数,也就是说我们可以通过这个接口来替代刚才有加密参数的接口。 在这里插入图片描述
  7. 这样一来我们的第一大步骤搜索功能已经没问题了,接下来我们直接使用代码来实现:
    name = input(\'请输入你想要下载的歌曲或者歌手名称:\')# 1. 发送请求url = f\'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w={name}\'headers = {    \'user-agent\': \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4878.0 Safari/537.36\',    \'referer\': \'https://y.qq.com/\',    \'cookie\': \'tvfe_boss_uuid=f0542efb9d5afa8f; pgv_pvid=3513549893; fqm_pvqid=19f09c8f-6393-48c0-89a8-a66d66effba8; ts_uid=9619573218; ts_refer=www.baidu.com/; RK=SLMc/7yEXe; ptcz=04d244800864a7991e28ebbca4029cafeb59af3398b03a7d8e7d6a4270f5d566; tmeLoginType=2; euin=7KSz7wnlNenF; fqm_sessionid=5b834678-7e69-4ad7-af51-b76cbe2e95da; pgv_info=ssid=s457338140; _qpsvr_localtk=0.7189543215478622; ptui_loginuin=570607808; login_type=1; wxunionid=; psrf_qqunionid=19742D7970E1762A57C9DC853E39C0DD; wxrefresh_token=; wxopenid=; psrf_access_token_expiresAt=1654431564; psrf_qqopenid=B987B555BDFB0C5F783A7283EF15872F; psrf_musickey_createtime=1646655564; qqmusic_key=Q_H_L_5aiZQ1W8q7L4RQmM4nlPPBTYd2zcPnty6yx6KX11_CuOoqyWm1SAziA; qm_keyst=Q_H_L_5aiZQ1W8q7L4RQmM4nlPPBTYd2zcPnty6yx6KX11_CuOoqyWm1SAziA; psrf_qqrefresh_token=F2600C600F8EF65DF189F17C37813654; qm_keyst=Q_H_L_5aiZQ1W8q7L4RQmM4nlPPBTYd2zcPnty6yx6KX11_CuOoqyWm1SAziA; psrf_qqaccess_token=A052AFFC796679CE579ED06AF6B594C2; uin=570607808; ts_last=y.qq.com/n/ryqq/search\'}# 2. 获取所有歌曲信息数据response = requests.get(url).textic(response)\'\'\'ic| response: \'callback({\"code\":0,\"data\":{\"keyword\":\"许嵩\",\"priority\":0,\"qc\":[],\"semantic\":{\"curnum\":0,\"curpage\":1,\"list\":[],\"totalnum\":0},\"song\":{\"curnum\":10,\"curpage\":1,\"list\":[{\"albumid\":37333,\"albummid\":\"002KSDg90IaScI\",\"albumname\":\"自定义\",\"albumname_hilight\":\"自定义\",\"alertid\":23,\"belongCD\":0,\"cdIdx\":1,\"chinesesinger\":0,\"docid\":\"13228557303107318536\",\"grp\":[],\"interval\":316,\"isonly\":0,\"lyric\":\"\",\"lyric_hilight\":\"\",\"media_mid\":\"000xHhh711Xkj8\",\"msgid\":16,\"newStatus\":2,\"nt\":3072731920,\"pay\":{\"payalbum\":0,\"payalbumprice\":0,\"paydownload\":1,\"payinfo\":1,\"payplay\":0,\"paytrackmouth\":1,\"paytrackprice\":200},\"preview\":{\"trybegin\":91042,\"tryend\":117181,\"trysize\":0},\"pubtime\":1231516800,\"pure\":0,\"singer\":[{\"id\":7221,\"mid\":\"000CK5xN3yZDJt\",\"name\":\"许嵩\",\"name_hilight\":\"<em>许嵩</em>\"}],\"size128\":5060843,\"size320\":12651818,\"sizeape\":0,\"sizeflac\":34519747,\"sizeogg\":7338992,\"songid\":460049,\"songmid\":\"003uh6Y81FI4Nv\",\"songname\":\"如果当时\",\"songname_hilight\":\"如果当时\",\"strMediaMid\":\"000xHhh711Xkj8\",\"stream\":1,\"switch\":16889603,\"t\":1,\"tag\":11,\"type\":0,\"ver\":0,\"vid\":\"l0024rsfet4\"},{\"albumid\":37333,\"albummid\":\"002KSDg90IaScI\",\"albumname\":\"自定义\",\"albumname_hilight\":\"自定义\",\"alertid\":23,\"belongCD\":0,\"cdIdx\":3,\"chinesesinger\":0,\"docid\":\"11643555463875498519\",\"grp\":[],\"interval\":241,\"isonly\":0,\"lyric\":\"\",\"lyric_hilight\":\"\",\"media_mid\":\"0036RQEx4fHEQF\",\"msgid\":16,\"newStatus\":2,\"nt\":3554465552,\"pay\":{\"payalbum\":0,\"payalbumprice\":0,\"paydownload\":1,\"payinfo\":1,\"payplay\":0,\"paytrackmouth\":1,\"paytrackprice\":200},\"preview\":{\"trybegin\":59000,\"tryend\":100629,\"trysize\":0},\"pubtime\":1231516800,\"pure\":0,\"singer\":[{\"id\":7221,\"mid\":\"000CK5xN3yZDJt\",\"name\":\"许嵩\",\"time\":1646657484,\"tips\":\"\"})\'\'\'\'
  8. 可以看到获取到的数据是一个不规则的json格式数据,我们给它掐头去尾将其转为json。 # 格式化json json_str = response[9: -1] json_dict = json.loads(json_str) ic(json_dict) 在这里插入图片描述

3. 使用prettytable格式化爬取到的信息使其更加优美的展示

  1. 接下来我们就可以从中提取歌名、歌手、专辑等信息了。
    # 3. 解析数据 歌曲 歌手名 专辑 歌曲mid(用来下载歌曲必须要的参数)song_list = json_dict[\'data\'][\'song\'][\'list\']count = 0# 4. 输出for song in song_list:    songname = song[\'songname\']    songmid = song[\'songmid\']    singer = song[\'singer\'][0][\'name\']    albumname = song[\'albumname\']    count += 1    print(songname, singer, albumname) \'\'\'灰色头像 许嵩 寻雾启示断桥残雪 许嵩 许嵩早期单曲集半城烟沙 许嵩 半城烟沙千百度 许嵩 苏格拉没有底想象之中 许嵩 苏格拉没有底留香 许嵩 留香惊鸿一面 许嵩 不如吃茶去城府 许嵩 自定义山水之间 许嵩 不如吃茶去拆东墙 许嵩 苏格拉没有底\'\'\'
  2. 接下来给大家介绍一下prettyTable。 PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格。它是一款很简洁但是功能强大的第三方模块,主要是将输入的数据转化为格式化的形式来输出,即:以表格的形式的打印输出出来,能够起到美观的效果。
    • PrettyTable 安装: pip install PrettyTable
    • 导入PrettyTable: import prettytable as pt
    • 创建表:tb = pt.PrettyTable()
    • 按行添加数据:tb.add_row(<list>)
    • 按列添加数据:tb.add_column(<list>) 更多使用方法大家下来可以自行查阅哈。。。。
  3. 我们导入所需要的库之后来打印我们爬取到的音乐列表, 展示如下:
    +------+----------+------+----------------+| 序号 |   歌名   | 歌手 |      专辑      |+------+----------+------+----------------+|  0   | 灰色头像 | 许嵩 |    寻雾启示    ||  1   | 断桥残雪 | 许嵩 | 许嵩早期单曲集 ||  2   | 半城烟沙 | 许嵩 |    半城烟沙    ||  3   |  千百度  | 许嵩 |  苏格拉没有底  ||  4   | 想象之中 | 许嵩 |  苏格拉没有底  ||  5   |   留香   | 许嵩 |      留香      ||  6   | 惊鸿一面 | 许嵩 |   不如吃茶去   ||  7   |   城府   | 许嵩 |     自定义     ||  8   | 山水之间 | 许嵩 |   不如吃茶去   ||  9   |  拆东墙  | 许嵩 |  苏格拉没有底  |+------+----------+------+----------------+

    是不是比美化之前的数据看起来整齐多了呢?

4. 输入歌手或者歌曲信息一键下载

  1. 歌曲已经成功的展示出来接下来的步骤我们就是下载歌曲了。 首先分析歌曲的下载链接,跟上述的分析方法是一样的。我们直接点击’播放音乐’按钮跳转到下一播放界面。 在这里插入图片描述
  2. 我之前有给大家讲过,媒体类音频视频等文件我们都可以在media中找到它的真实请求连接。在这里插入图片描述
  3. 我们将上述的音乐链接复制到浏览器中可以发现它是可以播放出音乐的。此时我们就可以右键直接下载该音乐了。 在这里插入图片描述
  4. 但是我们要的不止于此,所以我们还需继续往下分析。我们再来看看换一首歌的音乐链接是什么从而找到规律来进行批量下载 按照同样的方式我们找到另外一条音乐的链接。 在这里插入图片描述
    https://dl.stream.qqmusic.qq.com/C400002LWfVG0BBBUn.m4a?guid=6675368320&vkey=91D53539CF2FEA007E380F084DE2423E1DAADAF30FE0F750B57A5970DDB46CB7365F6397AEF311F0FE3C6FBA0AA1A341B2505AE5CF375DD2https://dl.stream.qqmusic.qq.com/C400004OWwZu0ADoow.m4a?guid=5425348720&vkey=36E28859EFB044F062AE36EA0757DA3C62DA7C64DB5F02895E5309D43AF8BF444DA19CB386996307C8CDF771C6C05B02569DDF6E891812B8https://dl.stream.qqmusic.qq.com/C400003mSEHX37FGda.m4a?guid=7772555791&vkey=20718D9C093C9F1DAB6384F074DBC2B363A91B9FC761CC757A2E7E37742BDB5662EFDC004103F7418470DF70C2F9D770B5F65FC46C45655F
  5. 可以看到这些没有任何规律可言,怎么办呢?实际上呢控制变化的参数就是这个m4a的文件。 在这里插入图片描述
  6. 我们可以将这个新发现的链接和之前的红框请求的链接进行对比:在这里插入图片描述
  7. 看到没规律已经出现了,就是缺少了一个网站的前缀。我们加上之后仍然可以正常的访问到音乐。
    C400003mSEHX37FGda.m4a?guid=2191681752&vkey=C437E4D3D760EA253678E6103C8E86667F8E99C6FBFA1E9A4E49A3ABF8DAF022E05932087D1A1A4DBFCC0032598DEE133B95FD7B4BA06ACA&uin=570607808&fromtag=66https://dl.stream.qqmusic.qq.com/C400003mSEHX37FGda.m4a?guid=7772555791&vkey=20718D9C093C9F1DAB6384F074DBC2B363A91B9FC761CC757A2E7E37742BDB5662EFDC004103F7418470DF70C2F9D770B5F65FC46C45655F&uin=570607808&fromtag=66

    在这里插入图片描述

  8. 但是我们找的这个链接也是一个post请求,也有加密的参数。。。。有什么办法可以绕过加密直接爬取音乐呢? 有,又来一个新的替代接口:
    https://u.y.qq.com/cgi-bin/musicu.fcg?data={\"req\":{\"module\":\"CDN.SrfCdnDispatchServer\",\"method\":\"GetCdnDispatch\", \"filename\":\"M800\",\"param\":{\"guid\":\"8846039534\",\"calltype\":0,\"userip\":\"\"}},\"req_0\":{\"module\":\"vkey.GetVkeyServer\",\"method\":\"CgiGetVkey\",\"filename\":\"M800\",\"param\":{\"guid\":\"8846039534\",\"songmid\":[\"%s\"],\"songtype\":[0],\"uin\":\"1152921504784213523\",\"loginflag\":1,\"platform\":\"20\"}},\"comm\":{\"uin\":\"1152921504784213523\",\"format\":\"json\",\"ct\":24,\"cv\":0}}\'
  9. 我们给使用上面找到的音乐的m4a在下面查找到他的songid进行替换之后访问仍旧可以找到真实的音乐链接。在这里插入图片描述 在这里插入图片描述
  10. 音乐下载部分我们到此也已经分析出来了,接下来上代码:
    while True:    input_index = eval(input(\'请输入你要下载的歌曲序号(-1)退出:\'))    if input_index == -1:        break    # 提取需要下载音乐的信息    download_info = music_info_list[input_index]    # 提取需要下载音乐的songmid    songmid = download_info[0]    # 1. 通过获取的歌曲mid 拼接 需要的音乐url    music_info_url = \'https://u.y.qq.com/cgi-bin/musicu.fcg?data={\"req\":{\"module\":\"CDN.SrfCdnDispatchServer\",\"method\":\"GetCdnDispatch\", \"filename\":\"M800\",\"param\":{\"guid\":\"8846039534\",\"calltype\":0,\"userip\":\"\"}},\"req_0\":{\"module\":\"vkey.GetVkeyServer\",\"method\":\"CgiGetVkey\",\"filename\":\"M800\",\"param\":{\"guid\":\"8846039534\",\"songmid\":[\"%s\"],\"songtype\":[0],\"uin\":\"1152921504784213523\",\"loginflag\":1,\"platform\":\"20\"}},\"comm\":{\"uin\":\"1152921504784213523\",\"format\":\"json\",\"ct\":24,\"cv\":0}}\' % songmid    # 2. 发送网络请求    json_data = requests.get(url=music_info_url, headers=headers).json()    ic(json_data)    # 3. 获取数据    purl = json_data[\'req_0\'][\'data\'][\'midurlinfo\'][0][\'purl\']    # 拼接url    media_url = \'https://dl.stream.qqmusic.qq.com/\' + purl    # 4. 发送请求 (mp3 数据所在的链接了)    # 5. 获取数据 音乐二进制数据    music_data = requests.get(media_url).content    # 6. 保存数据    with open(f\'歌曲下载/{download_info[1]}-{download_info[2]}.mp3\', mode=\'wb\') as f:        f.write(music_data)    print(f\'{download_info[1]}, 下载完成!\')

    最终效果: 在这里插入图片描述

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站(邮箱:1099252741@qq.com,备用微信:1099252741),本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。