爬虫程序抓取网易云音乐评论Top100的歌
注:该文章图片已丢失。
爬虫程序抓取网易云音乐评论Top100的歌
一、网易云音乐页面分析
网易云音乐网址 http://music.163.com,在上面可以查到所有歌手,进一步查到所有的专辑,再进一步查到所有的歌曲。
通过 Chrome 的开发者工具,在页面源码里发现评论数没有直接加载出来。在所有XMLHTTPRequest(XHR)里面,找到了一个申请评论的API,即 http://music.163.com/weapi/v1/resource/comments/R_SO_4_{song_id}/?csrf_token= ,如图:

这个API返回一个JSON

但是仔细观察发现,这个API的请求里涵盖两个奇奇怪怪的东西,就是请求体里面的 params和encSecKey。把这个请求导出为 curl 格式,放到 curl 里面一看,可以正常跑出结果,那么我们就不管了,这两个东西我们拿来直接用就可以。实际上这两个东西, params是加密后的密文,明文为一 json,包含一些请求信息,而encSecKey是秘钥。服务器根据秘钥和密文解得明文。换句话说,这个评论 API 是加密的。我推测在其他 API 比如登录 API 上,也应用了这个加密算法,而且请求体的 json 里面包含了用户名和密码,我们就不能直接拿这个现成的用,需要破解这个加密算法。显然这个算法已经写在了前端 JS 里面,网上其他人已经破解过这个算法,此处不再赘述。
经过试验,此API的HTTP请求头中不需要携带 cookie,只需要携带一个来自http://music.163.com/的 Referer 即可。
首先我们写一个函数,这个函数能够获取所有的歌手信息。在http://music.163.com/#/discover/artist页面我们可以看见所有歌手。
网易云音乐根据歌手地区分为华语、欧美、日本、韩国等等,每一个地区分为男/女/乐队三类,这个区别体现在后面的id字段,而每个分类的开头字母分类体现在后面的initial字段。initial字段的值是是开头字母的ASCII值。举个例子:以A开头的华语男歌手,链接为:http://music.163.com/#/discover/artist/cat?id=1001&initial=65。
如果不以字母和汉字开头,比如以数字开头,则initial = 0。
值得一提的是,网易云音乐的专辑、歌手、歌曲页面均是以子页面的形式加载的。所以如果想获取到对应的专辑、歌手、歌曲页面,需要去请求子页面而不是主页面。子页面的地址就是把主页面的/#/去掉。如以A开头的华语男歌手的子页面是:http://music.163.com/discover/artist/cat?id=1001&initial=65。
