import requests
import time
import re
import os
class MUSIC:
def __init__(self):
self.header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleW"
"ebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"}
self.song_list = []
self.song_number = 0
self.sing_name = ""
def search_music(self, singer_name):
"""搜索歌手名字
获取该歌手所有歌曲id
"""
url = "http://music.baidu.com/search"
self.sing_name = singer_name
param = {"key": singer_name}
response = requests.get(url, params=param, headers=self.header)
response.encoding = "utf-8"
html = response.text
# 先找到该歌手的歌曲总数
number = re.findall(r'<span class="number">(\d+)</span>', html)
song_number = number[0]
print("已找到歌手%s的歌曲%s首" % (singer_name,song_number))
song_number = int(song_number)
self.song_number = song_number
song_list =[]
for i in range(song_number//20 + 1):
param = {
"s": 1,
"key": singer_name,
"jump": 0,
"start": i*20,
"size": i*20+20,
"third_type": 0,
}
response = requests.get(url, params=param, headers=self.header)
response.encoding = "utf-8"
html = response.text
song_id = re.findall(r'sid":(\d+)', html)
song_list += song_id
time.sleep(1)
self.song_list = song_list
def download_music(self, path):
"""下载音乐"""
url = "http://play.baidu.com/data/music/songlink"
data = {
"songIds": ','.join(self.song_list),
"hq": 0,
"type": "mp3",
"pt": 0,
"flag": -1,
"s2p": -1,
"prerate": -1,
"bwt": -1,
"dur": -1,
"bat": -1,
"bp": -1,
"pos": -1,
"auto": -1,
}
response = requests.post(url,data=data,headers=self.header)
song_info = response.json()
song_info = song_info["data"]["songList"]
i = 0
path = path + "\\" + self.sing_name
self.mkdir(path)
for song in song_info:
song_name = song['songName']
i +=1
with open(path + "\\"+ '%s.mp3' % song_name,'wb') as f:
# 下载mp3文件
response = requests.get(song['songLink'], headers=self.header)
f.write(response.content)
print("已下载%s %d/%d" %(song_name,i,self.song_number))
time.sleep(1)
def mkdir(self, path):
"""判断路径是否存在,如果不存在,创建路径"""
path = path.strip()
path = path.rstrip("\\")
isExists = os.path.exists(path)
if not isExists:
# 如果不存在路径,创建路径
os.makedirs(path)
if __name__ == '__main__':
# 指定下载路径
path = "D:\\python学习\\百度音乐爬虫"
singer_name = input("请输入要下载歌曲的歌手名字:")
music = MUSIC()
music.search_music(singer_name)
music.download_music(path)
python批量下载音乐
最新推荐文章于 2024-05-27 11:39:18 发布