天天看点

爬虫和网易云音乐API的一次尝试

最近有空,在好友的呼唤下,帮助他做一个爬取网易云音乐排行榜信息的小程序,收获颇多.

       进入网易云官网.F12 

打开后发现网易云的API,参数被加密:

爬虫和网易云音乐API的一次尝试

对前端不太熟,也无从下手,只知道这个信息很重要,多亏了 百度一下 ,找到了很多陈旧的博客,有了些许蛛丝马迹.

多数用python去写,经过一些尝试,确定了不少可用的api接口,但是数据大多数不是不完整就是不正确,特别是音乐的下载链接,

那就一个网络上都是复制一个人的东西.

后来我看见一种全新的尝试方式,通过拦截前端调用的JS,本地调试.(我不会前端,对于我来说还是挺新奇的.)

大概方式如下:

1. 下载 Fiddler.exe ( http代理)

2. 进入网易云音乐官网 F12 - network - js ,找到core.js ,下载到本地.

爬虫和网易云音乐API的一次尝试

3.fidedle - AutoResponder - Add rule

爬虫和网易云音乐API的一次尝试

以上三步, 即可完成使用本地JS文件.

可是,这个文件是进过混淆的,你让我格式化排版 一行行看我也是可能.更何况JS不熟.

我就百度呗. 终于找到一点眉目.  一个关键词- windos.asrsea

这个普遍出现在别人的论坛博客中.我就试着搜~

爬虫和网易云音乐API的一次尝试

结果 还真有, 然后我看了看这个d函数,哎嘿,我看不懂 什么七七八八的东西,很绕~

  继续百度 ,知道了一些有趣的事情:

很多人分析这个函数是用来加密参数的,甚至分析出这个函数的各种语言版本.

我尝试了下 java的 和c# 的代码加密参数.~发现出来之后的格式样子还是有差别的.

所以,我想 为什么我要自己改写,为什么我不能直接调用? -‘js脚本 python调用’

我猜想并寻找, 真的可以 ,顺便写了几个例子玩儿,大概会用了.

Python  - execjs 

用它就行.

加密是完成了. 但是 加密什么东西呢? 

我们有它的JS文件,我试着打印LOG . 我能想到很多地方,我时不想看代码的,人很笨也比较懒惰.

在 windos.asrsea 被调用的哪一部分, 会传入 一段 URL的后缀 以及http请求的param.

爬虫和网易云音乐API的一次尝试

最后,

params = encText

encSecKey = encSecKey .

http请求头 必须带上两个信息:

Host:

music.163.com

Referer:

http://music.163.com/

还有一些其他有趣的东西,比如 广告植入 支付加密等 ,比较绕 不是太清楚,而且 大概上午 和 下午的JS混淆的不同,但是总的来说就2-3个core.JS文件

只是 混淆的单词不同,内容逻辑是一样的. 为什么上午的JS 到了下午不能用,我猜测 和 另外一个ga.js push.js 有关.不过无关紧要.

下面是 我找到的一些接口和参数打印的日志:

获取歌曲信息

{csrf_token: "fd1acbd02cc87df18472e5ecf775d12b"}

http://music.163.com/api/v3/song/detail?id=418603077&c=[{"id":"418603077"}]

Post请求

特别说明下:  

Csrf_token 这个值,似乎是从 js框架NEJ ,读取的一个固定值,但是有时候 同一台机器的这串值不同.  我在试验中发现,这个竟然可以为空.

用户登陆:

http://music.163.com/weapi/login

{username:"[email protected]",password:"85ba959c3bd635ee3e36eb627396a901",rememberLogin:"true",clientToken:"1_p6TngU67yeLbMmO6twZD0LG15hjOyDWo_iRZrSsAyAHKR+yLFk+BCgIXY3mEjgrYw",csrf_token:"9b213a0d047c0bf18b3e345fd8ce42cb"}

密码是 被MD5加密了.

获取评论

http://music.163.com/weapi/v1/resource/comments/R_AL_3_18903

{rid: "R_AL_3_18903", offset: "0", total: "true", limit: "20", csrf_token: "fd1acbd02cc87df18472e5ecf775d12b"}

模糊查询

http://music.163.com/weapi/search/suggest/multimatch

{s: "短发", csrf_token: "932a0858c7ea7678bbccb97b0d75f4fe"

...

还有更多 我不想一一成列了,我写了两个demo ,可直接运行,

1 直接抓取排行榜 热门歌曲的信息并下载歌曲 歌词等.

GITHUB : https://github.com/15608447849/music_pick

2 可查询下载歌曲, MV 无损音乐.

GITHUB:https://github.com/15608447849/music_download

百度云盘: https://pan.baidu.com/s/1o8KawuI

这次尝试,对于’爬虫’这个词有了新的认识,也发现的前端JS的不安全性.

对于python ,越来越觉得 方便简单快捷.

其实 很多时间,都是在尝试打印JS中的对象和数据.

最开始我只是想通过分析 HTML节点拿到数据,之前做过 数据爬虫 抓取

银行数据, 获取是 银行开发不能联网,并且很多不能用开源框架,很多做法都是比较简单,页面数据静态化,没有ajax等.及时有,也能分析出接口 ,拿出数据(不包括重要的信息,多数没有加密).

这次尝试中, 我也一度想研究下AES什么的加密,但是还是没这个时间.

记录下点点滴滴,记录下一些回忆.毕竟,编程= 不进则退.

做一个有梦想的年轻人.