您的位置:首页 > 编程语言 > Python开发

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

2017-11-18 15:42 134 查看
最近有空,在好友的呼唤下,帮助他做一个爬取网易云音乐排行榜信息的小程序,收获颇多.

       进入网易云官网.F12 

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



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

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

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

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

大概方式如下:
1. 下载 Fiddler.exe ( http代理)
2. 进入网易云音乐官网 F12 - network - js ,找到core.js ,下载到本地.



3.fidedle - AutoResponder - Add rule



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

可是,这个文件是进过混淆的,你让我格式化排版 一行行看我也是可能.更何况JS不熟.
我就百度呗.
终于找到一点眉目.  一个关键词- windos.asrsea

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


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

  继续百度 ,知道了一些有趣的事情:
很多人分析这个函数是用来加密参数的,甚至分析出这个函数的各种语言版本.

我尝试了下 java的 和c#
的代码加密参数.~发现出来之后的格式样子还是有差别的.
所以,我想 为什么我要自己改写,为什么我不能直接调用? -‘js脚本
python调用’
我猜想并寻找,
真的可以 ,顺便写了几个例子玩儿,大概会用了.
Python  -
execjs 
用它就行.

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

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

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



最后,

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:"qq793065165@163.com",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什么的加密,但是还是没这个时间.

 

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

做一个有梦想的年轻人.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息