Python批量下载音乐实战:解析API与正则提取
本文详细介绍如何利用Python批量下载在线音乐。通过requests库发送请求,结合正则表达式提取歌曲ID与真实播放链接,解析隐藏的API接口数据。文章涵盖环境配置、网页分析、URL拼接及完整代码实现,帮助开发者掌握从获取数据到保存文件的全流程操作。
Python批量下载音乐实战:解析API与正则提取
本文详解基于Python实现音乐批量下载的方法,通过示例代码展示具体步骤,为相关学习与工作提供参考。
音乐丰富了生活,但许多平台仅支持在线播放。作为技术人员,我们希望通过技术手段实现本地存储。
核心知识点与环境配置
本文涉及的核心知识点包括:
- requests
- 正则表达式
开发环境配置如下:
- 版本:anaconda5.2.0(python3.6.5)
- 编辑器:pycharm
需安装的第三方库包括:
- requests
- parsel
网页分析与API定位
接下来进行网页结构分析。
目标站点地址为:http://music.taihe.com/search?key=%E9%99%88%E7%B2%92
首先需要定位音乐的真实播放地址。
以陈粒的歌曲《走马》为例进行分析。

打开浏览器开发者工具,切换到Network标签页,筛选Media类别,刷新页面即可捕获音乐的真实请求地址。
该地址无法直接从网页源码中读取,说明百度音乐对链接进行了隐藏处理。这种情况通常由JavaScript动态拼接或加密请求链接,或者数据被隐藏导致。由于不确定具体机制,需进一步分析请求数据。

分析发现,真实音乐地址存在于如下API接口中:http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&callback=jQuery17206453751179783578_1544942124991&songid=243093242&from=web&_=1544942128336
请求该API返回的是JSON格式数据,对应Python中的字典类型。利用字典操作规则即可提取所需数据。
URL结构与批量下载逻辑
接下来通过URL拼接获取所有必要数据。
在获取单首音乐地址后,需进一步分析该URL的结构,以寻找批量下载所有音乐的方法。

仔细观察URL参数,发现问号后的from参数与_参数即使缺失,也不影响数据请求的正常返回。
此外,参数中的songid即为歌曲的唯一标识ID,而from参数用于标识来源平台。
因此,在批量下载音乐时,只需获取歌曲的songid,即可通过该接口下载所有目标歌曲。
批量获取歌曲ID方法
下面介绍如何批量获取songid。
使用开发者工具查看网页源码,可定位songid的位置。若分析歌手页面的URL,同样可以构造相应的请求来获取ID列表。
至此,网页分析部分结束。
效果展示与代码实现
以下是程序运行的实际效果展示。

完整代码实现如下:
import re
import requests
def get_songid():
"""获取音乐的songid"""
url = 'http://music.taihe.com/artist/2517'
response = requests.get(url=url)
html = response.text
sids = re.findall(r'href="/song/(\d+)" rel="external nofollow" ', html)
return sids
def get_music_url(songid):
"""获取下载链接"""
api_url = f'http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&songid={songid}&from=web'
response = requests.get(api_url.format(songid=songid))
data = response.json()
print(data)
try:
music_name = data['songinfo']['title']
music_url = data['bitrate']['file_link']
return music_name, music_url
except Exception as e:
print(e)
def download_music(music_name, music_url):
"""下载音乐"""
response = requests.get(music_url)
content = response.content
save_file(music_name+'.mp3', content)
def save_file(filename, content):
"""保存音乐"""
with open(file=filename, mode="wb") as f:
f.write(content)
if __name__ == "__main__":
for song_id in get_songid():
music_name, music_url = get_music_url(song_id)
download_music(music_name, music_url)
以上内容为本文全部知识,希望能为读者提供帮助,欢迎支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









