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
总结
音乐搜索下载可运行文件下载地址: