现在网络信息时代,网络应用普遍生活,小编我平时没事的时候就喜欢放歌听,所以今天就带着大家掌握一项新的“终端技术”开始啦,模拟登入网易云音乐。废话不多说,让我们愉快地开始吧~
开发工具
Python版本:3.6.4
相关模块:
argparse模块;
pick模块;
click模块;
DecryptLogin模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
既然要在终端看网易云的每日歌曲推荐,首先自然是要先模拟登录网易云啦,这部分可以利用公众号之前开源的DecryptLogin包来实现:
'''模拟登录'''
@staticmethod
def login(username, password):
lg = login.Login()
infos_return, session = lg.music163(username, password)
return session
复制代码
接着,我们来看看该如何获取网易云的每日歌曲推荐。简单抓包分析一下,可以发现如下图所示的链接:
请求它就可以返回每日推荐的歌曲信息:
好的,现在我们按照之前的方法来打个断点,看看需要提交哪些参数才能获得每日推荐的歌曲信息:
网易云个人听歌排行榜爬取
结果如下:
data = {
'crsf_token': csrf,
'limit': '999',
'offset': '0',
'total': 'true'
}
复制代码
简单测试一下:
'''获得每日推荐'''
def getdailyrecommend(self):
url = 'http://music.163.com/weapi/v2/discovery/recommend/songs?csrf_token='
data = {
'crsf_token': self.csrf,
'limit': '999',
'offset': '0',
'total': 'true'
}
data = self.cracker.get(data)
response = self.session.post(url, headers=self.headers, data=data)
response_json = response.json()
print(response_json)
复制代码
效果如下:
接着,从返回的数据中提取我们需要的数据:
response_json = response.json()
daily_recommend_infos = {}
if response_json['code'] == 200:
for item in response_json['recommend']:
songname = item['name']
songid = item['id']
singer = item['artists'][0]['name']
h = item['hMusic'].get('bitrate', 320000) if item['hMusic'] else 320000
m = item['mMusic'].get('bitrate', 192000) if item['mMusic'] else 192000
l = item['lMusic'].get('bitrate', 128000) if item['lMusic'] else 128000
brs = [h, m, l]
daily_recommend_infos[songid] = ['%s By %s' % (songname, singer), brs]
return daily_recommend_info
else:
raise RuntimeError('获取每日歌曲推荐失败, 请检查网络并重新运行程序...')
复制代码
来写个网易云个人歌单下载器?
加一个歌曲下载功能就可以愉快地查看每日歌曲推荐并下载自己喜欢的歌来听啦:
'''下载某首歌曲'''
def downloadSong(self, songid, songname, brs, savepath='.'):
play_url = 'http://music.163.com/weapi/song/enhance/player/url?csrf_token='
print('正在下载 ——> %s' % songname)
for br in brs:
data = {
'ids': [songid],
'br': br,
'csrf_token': self.csrf
}
res = self.session.post(play_url+self.csrf, headers=self.headers, data=self.cracker.get(data))
if res.json()['code'] == 200:
download_url = res.json()['data'][0].get('url', '')
if download_url:
break
with closing(self.session.get(download_url, headers=self.headers, stream=True, verify=False)) as res:
total_size = int(res.headers['content-length'])
if res.status_code == 200:
label = '[FileSize]:%0.2f MB' % (total_size/(1024*1024))
with click.progressbar(length=total_size, label=label) as progressbar:
with open(os.path.join(savepath, songname+'.'+download_url.split('.')[-1]), "wb") as f:
for chunk in res.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
progressbar.update(1024)
复制代码
文章到这里就结束了,感谢你的观看,学废了嘛?关注我每天分享Python相关知识。
为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。需要的可以私信我哦,期待你们的私信。