安装 requests 模块
python -m pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
安装 进度条 tqdm 模块
python -m pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple
导入模块
# 导入正则表达式模块,用于字符串的模式匹配和搜索
import re
# 导入requests库,这是一个非常流行的HTTP客户端库,用于发送HTTP请求(如GET、POST等)
import requests
# 导入tqdm库,这个库主要用于快速创建进度条,特别是在处理大量数据或迭代时
from tqdm import tqdm
# 导入os模块,这是Python的标准库之一,提供了与操作系统交互的功能,如文件操作、环境变量访问等
import os
解析数据
def download_music(music_path, page):
# 构造音乐列表页的URL,其中page为页面号
url = f"https://www.djcscs.com/index.php?ac=ajax_musicAjaxPage&scene_id=0&genre_id=0&lang_id=281&age_id=0&classid=0&feeling_id=0&subject_id=0&vip=0&page={page}"
# 发送POST请求获取音乐列表
res = requests.post(url)
# 从响应的文本中提取所有音乐的ID
musicid = re.findall('MusicId MusicId-(.*?)"', res.text)
# 设置cookies,这通常用于保持会话状态
cookies = {
'PHPSESSID': '61nkur5b13vkvj8b2o5r0hsnj1',
'Hm_lvt_79e32657a6675f0e9b46c23a8bce03f3': '1713261984',
'adminUrl': 'https%3A%2F%2Fwww.djcscs.com%2Findex.php%3Fac%3Dmusic_index',
'Hm_lpvt_79e32657a6675f0e9b46c23a8bce03f3': '1713262874',
}
# 设置请求头,用于模拟浏览器行为
headers = {
'Referer': 'https://www.djcscs.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0'
}
# 设置请求参数,这些参数通常用于告诉服务器我们要执行的操作
params = {
'ac': 'music_getMusic',
}
# 遍历所有提取到的音乐ID
for cid in musicid:
data = {
'id': cid, # 构造要请求的音乐的ID
}
# 发送POST请求获取音乐信息
response = requests.post('https://www.djcscs.com/index.php', params=params, cookies=cookies, headers=headers, data=data)
下载获取数据
# 在获取音乐信息之后,执行以下操作来下载音乐文件
if response.status_code == 200 and 'data' in response.json() and 'title' in response.json()['data'] and 'mp3' in response.json()['data']:
# 提取音乐标题
title = response.json()['data']['title']
# 清理标题中的非法字符,生成合法的文件名
audio_name = re.sub(r'[^\w\s.-]', '', title)
# 提取音乐的mp3链接
mp3_url = response.json()['data']['mp3']
# 使用HEAD请求获取音乐文件的大小(以字节为单位)
# 注意:不是所有服务器都支持HEAD请求或提供Content-Length头部
response_size = int(requests.head(mp3_url).headers.get('content-length', 0))
# 使用tqdm库创建一个进度条对象
# total: 总大小(以字节为单位)
# desc: 进度条的描述信息
# unit: 进度条显示的单位,'B' 表示字节
# unit_scale: 是否使用KB, MB等单位自动缩放
# unit_divisor: 单位缩放的除数
with tqdm(total=response_size, desc=f"正在下载---> {audio_name}.mp3", unit='B', unit_scale=True, unit_divisor=1024) as pbar:
# 发起GET请求,使用stream=True参数来流式传输数据
with requests.get(mp3_url, stream=True) as r:
# 确保请求成功
if r.status_code == 200:
# 以二进制写入模式打开文件
with open(f'{music_path}/{audio_name}.mp3', 'wb') as f:
# 迭代地读取响应内容,每次读取一个块
for chunk in r.iter_content(chunk_size=1024):
if chunk: # 确保块不为空
# 将块写入文件
f.write(chunk)
# 更新进度条
pbar.update(len(chunk))
else:
print(f"下载失败,状态码:{r.status_code}")
调用函数
# 定义一个主函数,用于执行整个下载流程
def main():
# 设置音乐文件将要保存的路径
music_path = 'D:/音乐/熊猫DJ音乐'
# 使用os.makedirs创建目录,如果目录已存在则不会报错(exist_ok=True)
os.makedirs(music_path, exist_ok=True)
# 假设每页有音乐可以下载,循环从第1页到第10页
for page in range(1, 11):
# 调用download_music函数,传入保存路径和当前页码作为参数
# 这里假设download_music函数会处理每页音乐的下载
download_music(music_path, page)
# 当这个脚本作为主程序运行时,执行main函数
if __name__ == "__main__":
main()
完整代码
# 导入正则表达式模块,用于字符串的模式匹配和搜索
import re
# 导入requests库,这是一个非常流行的HTTP客户端库,用于发送HTTP请求(如GET、POST等)
import requests
# 导入tqdm库,这个库主要用于快速创建进度条,特别是在处理大量数据或迭代时
from tqdm import tqdm
# 导入os模块,这是Python的标准库之一,提供了与操作系统交互的功能,如文件操作、环境变量访问等
import os
def download_music(music_path, page):
# 构造音乐列表页的URL,其中page为页面号
url = f"https://www.djcscs.com/index.php?ac=ajax_musicAjaxPage&scene_id=0&genre_id=0&lang_id=281&age_id=0&classid=0&feeling_id=0&subject_id=0&vip=0&page={page}"
# 发送POST请求获取音乐列表
res = requests.post(url)
# 从响应的文本中提取所有音乐的ID
musicid = re.findall('MusicId MusicId-(.*?)"', res.text)
# 设置cookies,这通常用于保持会话状态
cookies = {
'PHPSESSID': '61nkur5b13vkvj8b2o5r0hsnj1',
'Hm_lvt_79e32657a6675f0e9b46c23a8bce03f3': '1713261984',
'adminUrl': 'https%3A%2F%2Fwww.djcscs.com%2Findex.php%3Fac%3Dmusic_index',
'Hm_lpvt_79e32657a6675f0e9b46c23a8bce03f3': '1713262874',
}
# 设置请求头,用于模拟浏览器行为
headers = {
'Referer': 'https://www.djcscs.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0'
}
# 设置请求参数,这些参数通常用于告诉服务器我们要执行的操作
params = {
'ac': 'music_getMusic',
}
# 遍历所有提取到的音乐ID
for cid in musicid:
data = {
'id': cid, # 构造要请求的音乐的ID
}
# 发送POST请求获取音乐信息
response = requests.post('https://www.djcscs.com/index.php', params=params, cookies=cookies, headers=headers, data=data)
# 在获取音乐信息之后,执行以下操作来下载音乐文件
if response.status_code == 200 and 'data' in response.json() and 'title' in response.json()['data'] and 'mp3' in response.json()['data']:
# 提取音乐标题
title = response.json()['data']['title']
# 清理标题中的非法字符,生成合法的文件名
audio_name = re.sub(r'[^\w\s.-]', '', title)
# 提取音乐的mp3链接
mp3_url = response.json()['data']['mp3']
# 使用HEAD请求获取音乐文件的大小(以字节为单位)
# 注意:不是所有服务器都支持HEAD请求或提供Content-Length头部
response_size = int(requests.head(mp3_url).headers.get('content-length', 0))
# 使用tqdm库创建一个进度条对象
# total: 总大小(以字节为单位)
# desc: 进度条的描述信息
# unit: 进度条显示的单位,'B' 表示字节
# unit_scale: 是否使用KB, MB等单位自动缩放
# unit_divisor: 单位缩放的除数
with tqdm(total=response_size, desc=f"正在下载---> {audio_name}.mp3", unit='B', unit_scale=True, unit_divisor=1024) as pbar:
# 发起GET请求,使用stream=True参数来流式传输数据
with requests.get(mp3_url, stream=True) as r:
# 确保请求成功
if r.status_code == 200:
# 以二进制写入模式打开文件
with open(f'{music_path}/{audio_name}.mp3', 'wb') as f:
# 迭代地读取响应内容,每次读取一个块
for chunk in r.iter_content(chunk_size=1024):
if chunk: # 确保块不为空
# 将块写入文件
f.write(chunk)
# 更新进度条
pbar.update(len(chunk))
else:
print(f"下载失败,状态码:{r.status_code}")
# 定义一个主函数,用于执行整个下载流程
def main():
# 设置音乐文件将要保存的路径
music_path = 'D:/音乐/熊猫DJ音乐'
# 使用os.makedirs创建目录,如果目录已存在则不会报错(exist_ok=True)
os.makedirs(music_path, exist_ok=True)
# 假设每页有音乐可以下载,循环从第1页到第10页
for page in range(1, 11):
# 调用download_music函数,传入保存路径和当前页码作为参数
# 这里假设download_music函数会处理每页音乐的下载
download_music(music_path, page)
# 当这个脚本作为主程序运行时,执行main函数
if __name__ == "__main__":
main()