网易云音乐接口解析
我们都知道,爬虫网易云音乐时候参数是经过加密的,所以在分析网易云接口的时候要了解它的加密过程,下面来看看怎么实现爬虫的整个过程。Part1 进行网页分析首先打开网易云的网页版点击搜索音乐,这里我们以音乐:后来,为例Part2 进行数据包分析鼠标右键审查元素或者直接打开F12,进入调试界面,然后点击网络点击播放按钮,出现了如图所示的数据包,点击箭头所指的数据包内容这里得到了点击播放返回的json数据
我们都知道,爬虫网易云音乐时候参数是经过加密的,所以在分析网易云接口的时候要了解它的加密过程,下面来看看怎么实现爬虫的整个过程。
Part1 进行网页分析
- 首先打开网易云的网页版
- 点击搜索音乐,这里我们以音乐:后来,为例
Part2 进行数据包分析
- 鼠标右键审查元素或者直接打开F12,进入调试界面,然后点击网络
- 点击播放按钮,出现了如图所示的数据包,点击箭头所指的数据包内容
- 这里得到了点击播放返回的json数据,里面包含了播放音乐的url,现在我们怎么得到这个url呢
Part3 请求分析
-
点击请求头,它这里利用的post请求,所以在浏览器地址栏直接打开不会有对应的信息
-
这里查看它附加携带的参数,这里post请求携带了两个参数,一个是params,一个是enSecKey,这两个参数经过了加密,然后附带给post请求发送给服务器。才能得到json结果,这里体现了网易云的强大加密,经过发现,这里的params和enSecKey主要对音乐id的加密
-
分析加密过程,点击发起程序,可以看到它的加密过程是由js加密的,在js代码中搜索encSecKey关键词定位到该部分,可以发现它的加密由asrsea函数加密
- 这里找到加密函数asrsea=d,d为真正的加密函数
Part3 参数获取
-
这里我们虽然不能解密它的过程,但是我们可以利用歌曲的id进行加密,在python中调用它的js加密函数,得到它的加密参数,从而构造参数请求,这里利用一首歌的id进行加密得到的两个参数,得到了参数之后,我们就可以构造post请求
-
这里利用得到的参数构造post请求发送
-
得到了请求的数据,里面含有url真实的播放地址
Part4 搜索分析
由搜索关键词得到所有id,前面我们得到通过一首歌的id得到音乐播放url的真实地址,那么接下来我们怎么通过搜索关键词得到所有歌的id呢
- 这里我们搜索一首大眠,怎么得到所有id的信息呢
- 我们点击搜索后,箭头所指的数据包中含有我们搜索音乐的所有id,这时候我们就可以得到了id
3. 这里我们看它的请求url也是post请求,后面没发现请求参数,我们去看看它是否由请求参数
- 这里的仍然携带两个参数,params和encSecKey,和之前的一样,经过发现,这里的参数是搜索关键词经过加密后的参数
- 我们在pyhon中搜索"大眠",返回了大眠的加密参数
-
得到了加密参数后,我们就可以构造post请求了
-
这里的话会返回所有歌曲的id的json数据包,就可以提取所有的id了
python代码实现
import requests
import execjs
def getSongInfo(songname):
#得到搜索信息
url='https://music.163.com/weapi/cloudsearch/get/web?csrf_token='
params = ctx.call('keySet', songname)
data = {
'params': params['encText'],
'encSecKey': params['encSecKey']
}
#得到的所有歌曲信息
response = requests.post(url, data=data, headers=headers)
#得到所有的歌曲信息
songinfo=response.json()['result']['songs']
song_name_list=[]
song_id_list=[]
#提取前三首的id
for i in range(3):
id=songinfo[i]['id']
name=songinfo[i]['ar'][0]['name']
song_id_list.append(id)
song_name_list.append(name)
return song_id_list,song_name_list
def geturl(songid):
url_list=[]
for i in range(3):
id=songid[i]
# 请求url
url = 'https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token='
params=ctx.call('params',id)
data = {
'params': params['encText'],
'encSecKey': params['encSecKey']
}
response=requests.post(url,data=data,headers=headers).json()
geturl=response['data'][0]['url']
url_list.append(geturl)
return url_list
if __name__=='__main__':
#得到前三首歌的音乐id
songid,songname=getSongInfo(input("请输入歌曲名字:\n"))
urls=geturl(songid)
for i in range(3):
if(urls[i]):
print(songname[i]+"\t\t\t"+urls[i])
说明:未经作者许可,禁止转载!!!如有侵权,联系作者删除!!!
更多推荐
所有评论(0)