python3 下载百度音乐某歌手所有歌曲歌词的实现思路以及流程 download baidu music lyrics

最前言:我会有猫的,一定会的。——海叔

写在“写在前言后面****”的前面:现在是这个写出来的第二天,百度已经封了我的IP,但很快就又可以用了,不长期更新,可能会短期更新。

写在前言后面:原本准备做“中国摇滚音乐究竟在唱什么”,利用云词图分析中国目前摇滚乐所唱的内容。

可是要想获取摇滚乐所唱内容,就必须获取摇滚乐的歌词。

因此问题从“获取摇滚乐主要内容”变成“获取摇滚乐歌词”+“歌词分析”+“云图制作”

所以第一步就是获取摇滚乐歌词:

1,首先想到利用开放的歌词API来获取歌词,于是找到歌词迷提供的API(http://geci.me

但是本人认为该API不是很方便,因为只能通过“歌曲名称”和“歌手名”来获取歌词,虽然返回为json格式,但是如果批量操作存在两个缺陷①多次请求造成接口拥堵而失败。②批量操作很繁琐 所以放弃使用这种方法。

2,使用歌词网获取歌词,但苦于目前没有找到结构清晰,采集方便的歌词网。所以放弃这个办法。

但是一想到我未来可爱的猫纯洁的眼神,我就告诉自己“不能放弃”

所以有了方法③自己造“轮子” 自己动手丰衣足食

过程如下:

一:几经周折选择了百度音乐。优点:(1)所有歌曲都是以ID的方式来辨别,不存在转码的问题。(2)可以直接在页面抓取歌词

二:例如陈奕迅的歌手ID为1077(别问我怎么知道,我测试的都要吐了)所以歌手的主页就是“http://music.baidu.com/artist/+ID”

在这个页面就可以获取歌曲了。

那么问题①来了:百度音乐有一个问题就是每一页只能显示25首歌曲,比如陈奕迅在百度音乐有501首歌曲,那么就需要21页来显示。但是在切换页面的时候并没有通过“普通方式”(例如:在地址栏加上“&page=n”此类)而是通过get获取数据。解决办法:通过抓包得到提交地址为“http://music.baidu.com/data/user/getsongs?start=+N”其中的N为25的倍数,如果不是25的倍数,则会显示出错。提交后返回json数据。那么问题②来了,一个页面抓取之后怎么进行第二个页面的抓取呢?不急,我们从某歌手主页可以通过正则找到他在百度音乐被收录了多少歌曲。所以实际的页数也就是N%25+1(此处%为C语法,在Python3中为//)为什么+1呢?因为第一次请求json数据为“http://music.baidu.com/data/user/getsongs?start=0”从开始,所以务必+1。将所有的歌曲ID提取,做成一个list,返回即可。

三:我们得到了所有的音乐ID,那么我们只需要得到歌词下载地址即可。百度歌曲的地址为“http://music.baidu.com/song/+ID”此处的ID我们已经提取完毕。通过对这个页面的分析,我们得出该歌曲的下载地址。万事俱备,让我们来下载吧!

四:通过下载我们终于下载了陈奕迅将近500首的歌曲歌词了。

海叔的小猫咪表示很开心(然而我并没有猫,这是我虚构的)

本练手项目已经在github开源,地址为https://github.com/Pidbid/baiduMusic_getLrc

最后献上一首歌,并说:“摇滚才能救中国”我的小猫咪点点头。


python3 下载百度音乐某歌手所有歌曲歌词的实现思路以及流程 download baidu music lyrics
https://www.wicos.me/jishu/394/
作者
Wicos
发布于
2018年2月19日
许可协议