python实现千千音乐mp3下载

进入千千音乐主页面,选择周杰伦的音乐告白气球,发现竟然是2016年的音乐试听都木有,悲伤。那么有没有办法可以获取到mp3文件呢?答案是肯定的。音乐下载可运行程序可在文末获取。 说干就干,打开榜单,选择新歌一首可以试听的,第一首生僻字就可以听。

1.分析接口信息

打开开发者工具,这种音乐文件肯定是通过api提交的,在毛毛多的请求中发现可以获取音乐文件的请求,看图 查看请求详细信息 参数songid在当前url地址里面可以找到,简单,from应该是web或者app之类的,format定义返回数据形式不用改,method不用改,_参数timestamp 13位时间戳,callback是返回数据的json数据的前面的名字,其中下划线后面的1546915161467为13位的timestamp 时间戳,前面的17200943498528136486就不知道是啥意思了,我们先不改变不知道的内容,试试知道含义的内容看看能否获取到信息 python3代码

import requests
import time
apiurl= "http://musicapi.taihe.com/v1/restserver/ting"
callback = "jQuery17200943498528136486_"+str(round(time.time()*1000))
hua = str(round(time.time()*1000))
params = {
          
   "method"="baidu.ting.song.playAAC","format":"jsonp","songid":"611238837","from":"web","callback":callback,"_":hua}
text = requests.get(apiurl,params=params).text
text

发现可以获取到结果,那么接下来就是批量下载下来听了。

2.批量下载音乐到本地

由于上面的例子返回的是json格式的文本,那么只需要使用json解析json文本获取mp3文件使用requests下载就可以了。上代码

import requests
import time
import re,json

def get_song_list():
	text = requests.get("http://music.taihe.com").text
	songid = re.findall(rhref="/song/(d+)",text)
	return songid
def get_mp3_address_and_download(songid): 
 	apiurl= "http://musicapi.taihe.com/v1/restserver/ting" 
 	callback = "jQuery17200943498528136486_"+str(round(time.time()*1000)) 
 	hua = str(round(time.time()*1000)) 
 	params = {
          
   "method":"baidu.ting.song.playAAC","format":"jsonp","songid":songid,"from":"web","callback":callback,"_":hua} 
 	text =  json.loads(requests.get(apiurl,params=params).text.split(callback)[1][1:-2])
 	song_address = text["bitrate"]["file_link"]
 	mp3w = open(songid+".mp3",wb)
 	mp3w.write(requests.get(song_address).content)
 	mp3w.close()
def main():
	try:
		for songid in get_song_list():
			get_mp3_address_and_download(songid)
	except:
		print("network error")

这下就完全下载了千千音乐首页的mp3了

3.搜索并下载音乐到本地

然后使用pyinstaller打包脚本成exe文件,命令

pyinstaller --onefile download_music.py

总结

音乐搜索下载可运行文件下载地址:

经验分享 程序员 微信小程序 职场和发展