我们都知道,爬虫网易云音乐时候参数是经过加密的,所以在分析网易云接口的时候要了解它的加密过程,下面来看看怎么实现爬虫的整个过程。

Part1 进行网页分析

  1. 首先打开网易云的网页版
  2. 点击搜索音乐,这里我们以音乐:后来,为例

Part2 进行数据包分析

  1. 鼠标右键审查元素或者直接打开F12,进入调试界面,然后点击网络

  1. 点击播放按钮,出现了如图所示的数据包,点击箭头所指的数据包内容

  1. 这里得到了点击播放返回的json数据,里面包含了播放音乐的url,现在我们怎么得到这个url呢

Part3 请求分析

  1. 点击请求头,它这里利用的post请求,所以在浏览器地址栏直接打开不会有对应的信息

  2. 这里查看它附加携带的参数,这里post请求携带了两个参数,一个是params,一个是enSecKey,这两个参数经过了加密,然后附带给post请求发送给服务器。才能得到json结果,这里体现了网易云的强大加密,经过发现,这里的params和enSecKey主要对音乐id的加密

  3. 分析加密过程,点击发起程序,可以看到它的加密过程是由js加密的,在js代码中搜索encSecKey关键词定位到该部分,可以发现它的加密由asrsea函数加密

  1. 这里找到加密函数asrsea=d,d为真正的加密函数


Part3 参数获取

  1. 这里我们虽然不能解密它的过程,但是我们可以利用歌曲的id进行加密,在python中调用它的js加密函数,得到它的加密参数,从而构造参数请求,这里利用一首歌的id进行加密得到的两个参数,得到了参数之后,我们就可以构造post请求

  2. 这里利用得到的参数构造post请求发送

  3. 得到了请求的数据,里面含有url真实的播放地址


Part4 搜索分析

由搜索关键词得到所有id,前面我们得到通过一首歌的id得到音乐播放url的真实地址,那么接下来我们怎么通过搜索关键词得到所有歌的id呢

  1. 这里我们搜索一首大眠,怎么得到所有id的信息呢

  1. 我们点击搜索后,箭头所指的数据包中含有我们搜索音乐的所有id,这时候我们就可以得到了id


3. 这里我们看它的请求url也是post请求,后面没发现请求参数,我们去看看它是否由请求参数

  1. 这里的仍然携带两个参数,params和encSecKey,和之前的一样,经过发现,这里的参数是搜索关键词经过加密后的参数

  1. 我们在pyhon中搜索"大眠",返回了大眠的加密参数

  1. 得到了加密参数后,我们就可以构造post请求了

  2. 这里的话会返回所有歌曲的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])

说明:未经作者许可,禁止转载!!!如有侵权,联系作者删除!!!

来源:代码改变世界~

物联沃分享整理
物联沃-IOTWORD物联网 » 网易云音乐接口解析

发表评论