美文网首页
分享我用NodeJS实现网略爬虫抓取网易云音乐评论的过程

分享我用NodeJS实现网略爬虫抓取网易云音乐评论的过程

作者: HavenXie | 来源:发表于2017-03-27 00:20 被阅读0次

    午饭过后准备看看书,写写诗(这么说是不是显得太装逼。。。)

    打开网易云音乐(这不是做广告,网易没有给我钱),被推荐了一首《Nothing's Gonna Change My Love For You》,对,你没看错,就是这首很经典的歌。作为曾经向小伙伴们安利过网易云的我怎么能不看歌曲评论(又在装逼)。

    很感人有没有

    被感动的稀里哗啦,欲语泪流 。。。想起了自己的那段故事,此情此景再也抑制不住内心的那股洪流,于是静静的敲起那些深藏在脑海深处的记忆(贱人就是矫情)

    是经过篮球场,这逼装的华丽丽的失败了

    不知道你有没有发现,我还是很有才华的(其实是憋了好久才写出来的)。

    就这样,拖着腮,静静地发呆(别问我静静是谁),,,沉寂在这首音乐里,永远都不想醒来。。。

    额 额 额。。。好像扯远了,背景铺垫完毕,开始进入主题。

    网易云音乐每首歌都会有唯一的ID号,在网页端的网易云音乐里搜索一首歌可以看到浏览器地址栏是这样的

    浏览器地址栏看到的id

    这首歌id号27955655 对应的是薛之谦的 《我想起你了》 。页面往下拉可以看到评论,分为精彩评论和最新评论两部分。

    我们想抓取用户评论的信息除了要知道歌曲ID号还要知道评论信息的api地址。这时候就要看浏览器后台了,我用的是Chrome浏览器,F12进入后台(其他浏览器进入后台的方式你自己找)。点击Network并重新刷新浏览器。这时会看到一堆网络请求,经过分析,可以发现下面这个就是请求用户评论的url

    url地址

    我们点击它就会看到浏览器解析出的具体数据,如下图

    浏览器解析后的数据

    看到那个hotComments和comments了吗? 哈哈,这正是我们所需要的数据。

    现在我们把上面的url地址直接复制出来放入浏览器的地址导航栏中然后回车。理论上这时候用户的评论信息应该会显示出来,但是却是什么都没有,心都凉了。

    不要气馁,继续分析。

    我们发现上面那个url请求的请求头是这样的。

    评论信息请求头

    它采用的是post的方式,而且里面还有一堆数据,而我们直接把这个url放到地址栏中请求是get方式,且不说方式不对,就是请求头里面一堆数据你没有,人家网易的服务器也不认识你呀。于是我们只能通过代码的方式去验证了。

    我们把正确的请求头拷贝出来放到我们自己定义的对象中。然后程序发请求时把这个对象传进去不就行了吗? 

    我们定义的自己的请求头

    然后我们把http模块导入进来之后就可以写请求函数然后发请求了,但是,但是, 但是。重要的事情说三遍,数据并没有回来,就这样纠结了好久,后来发现网易把数据加密了,这样我们就需要解密。这时发现正确的请求头下面有两个参数

    请求头下面的两个可疑参数

    对,你没有看错,就是这个坑,他就是秘钥。

    有了秘钥我们就可以用它来解密了,我们把它拷贝到我们自己定义的对象中并格式化成url参数形式,然后传入请求函数就好了

    我们定义的自己的秘钥参数

    下面开始写请求函数了,我们这里传入三个参数,第一个是歌曲的ID(songID),第二个是我们上面定义的请求头(option),第三个是我们上面定义的秘钥(postData)。

    核心函数,数据请求函数

    其中的printInfo是向控制台输出相关信息。writeFile是将数据写入我们本地的文件中。

    然后我们执行这个函数 ,就可以在控制台看到数据了,程序执行结束后会看到生成了一个data.json文件,这里面存储的就是我们请求回来的数据。

    但是只抓取一首歌曲怎么够,最后我们再写一个循环,用来获取其他歌曲的评论信息。

    主入口函数

    这里我们从ID号为2080326开始,循环请求了100个ID号,也就是说我们想抓取100首歌的评论信息。但是结果是这样的。

    控制台输出的信息

    可以看到,只抓到了21首歌曲的信息,我们明明循环了100次啊,这是怎么回事?经过分析,原因有2种。

        1.我们在上面的代码中写道if(resData.total == 0) return;这样的话那些没有评论的歌曲就被我们忽略了。

        2.歌曲的ID号并不是连续的,也就是说这100个ID里有很多是空的,并没对应到任何歌曲。我们随便找一个该区间内没有打印出来的ID号试一下(我试的是http://music.163.com/#/song?id=2080412),结果真的没有相应歌曲。但是歌曲到底是怎么分配ID号的,我是真不知道,估计只有网易云的人才知道吧。

    我们再看看生成的data.json文件里的内容对不对,打开之后先格式化然后直接拉到最后,如下图:

    生成的data,json文件中的数据/

    可以看到也是21首,并且ID号也是相同的。

    至此大功告成。

    注意: 

    1. 网易云音乐的歌曲ID并不是连续的,具体ID号是怎么的排列我也不知道。大家不要太贪心,玩玩就好,不要使劲得抓人家的数据,否则网易把你的号给封了就尴尬了。

    2. 我用的node环境是6.10.0版,建议用最新的稳定版本。也可以和我保持同步。win平台上安装:官方下载后直接傻瓜式“下一步”就好了。如果你装了nvm的话可以在线安装不同版本,nvm可以很方便在各个版本中切换,具体怎么安装、使用nvm可以在网上找资料,也可以找我探讨。

    3. 代码中用到了部分ES6的语法,只是用到了几个基础的node 自带包。其他的我也不会。

    4. 代码托管到github。https://github.com/havenxie/webcrawler-neteast-music  请不要用来干坏事。

    5. 使用方式见github

    相关文章

      网友评论

          本文标题:分享我用NodeJS实现网略爬虫抓取网易云音乐评论的过程

          本文链接:https://www.haomeiwen.com/subject/xlbgnttx.html