python萌新笔记----基于requests库请求API下载网易云(VIP)音乐

一.题记

偶然的情况下了解到了关于API的一些妙用,利用所学知识使用目前网上公开的API来获取需要付费才能下载的网易云音乐。

二.API的粗浅看法

目前感觉就是设置了网页请求头中params的响应参数之后,访问API接口,对方就会返回一系列json数据,从这些json数据可以抽取出音乐文件的链接,由于现在网络信息更新很快,读者想要API可以自行百度,实时更新,避免接口失效
python萌新笔记----基于requests库请求API下载网易云(VIP)音乐_第1张图片

三.思路

1.设置请求头信息,主要是params里的参数,相应的键值需要分析网页
2.请求API获得json数据,分析json数据,根据字典的相应语法取出想要的数据,每首歌曲都有自己的ID号码,首先需要取出这个数据
3.通过ID号定位找到歌曲的链接,下载歌曲
4.优化交互界面

四.代码实现及运行

import requests
import json

class MyMusic(object):
    def __init__(self):
        # 设置请求头
        self.url = "https://api.imjad.cn/cloudmusic/"  # api
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",}
        self.params_search = {
            'type': 'search',
            'search_type': str(1),
            'limit': str(20),#返回20个搜索结果
            's': '',#歌手
            'offset': str(0)
        }
        self.params_download = {
            'type': 'song',
            'id': '',#歌曲ID
            'br': str(320000),#高品质的音质
        }

    def SearchData(self, name):
        #响应的json数据
        self.params_search['s'] = name
        response = requests.get(url=self.url, headers=self.headers, params=self.params_search)
        html = response.json()
        return html

    def SearchList(self, name):
        #打印搜索列表
        html = self.SearchData(name)
        song_id = []
        song_name = []
        song_author = []
        try:
	        for i in range(20):#params里设置的搜索返回20条数据
	            song_id.append(html["result"]["songs"][i]['id'])
	            song_name.append(html["result"]["songs"][i]['name'])
	            song_author.append(html["result"]["songs"][i]['ar'][0]['name'])
	            print('(ID:' + str(song_id[i]) + ')歌名:' + song_name[i] + ' ------ 歌手:' + song_author[i])
		except Exception:
        	pass

    def SearchSong(self, name, author):
        #匹配歌手,返回id号
        html = self.SearchData(name)
        for i in range(20):
            if html["result"]["songs"][i]['ar'][0]['name'] == author:
                return html["result"]["songs"][i]['id']

    def DownLoad(self, id):
        #下载
        self.params_download['id'] = id
        response = requests.get(url=self.url, headers=self.headers, params=self.params_download)
        url = response.json()['data'][0]['url']
        print("正在下载:" + self.params_search['s'])
        response = requests.get(url, headers=self.headers)
        filename = "music\\" + self.params_search['s'] + ".mp3"
        with open(filename, 'wb')as f:
            f.write(response.content)
            print("下载成功!")

    def run(self):
        print("@程序优化中,歌名歌手输入框出现繁体或片假名则不能正常运行\n"
              "@歌曲框输入exit退出程序\n"
              "@歌手框输入exit则放弃操作\n")
        while(True):
            try:
                name = input("请输入歌曲名称: ")
                if name == 'exit':
                    break
                print('======================搜索到的歌曲====================')
                self.SearchList(name)
                id = (input("请输入歌手名称或歌曲ID: "))
                if id == 'exit':
                    continue
                elif str.isdigit(id):
                #输入的是ID号,则直接下载
                    self.DownLoad(id)
                else:
                #输入的是歌手名字,匹配ID号
                    id = str(self.SearchSong(name, id))
                    self.DownLoad(id)
            except Exception:
                print("哎呀!下载出错了!可能原因如下\n" 
                      "1.您下载的歌热度不高哦\n" 
                      "2.请确保该歌曲在网易云搜索到\n" 
                      "3.程序崩溃了@_@")
                pass

t = MyMusic()
t.run()

运行结果:
python萌新笔记----基于requests库请求API下载网易云(VIP)音乐_第2张图片

五.总结

如果复制代码需要创建music文件夹。。。代码不是很完善,欢迎大家和我一起交流或指教@_@

你可能感兴趣的:(Python笔记,API,requests,网易云音乐,VIP,人工智能)