网易云音乐接口解析
我們都知道,爬蟲(chóng)網(wǎng)易云音樂(lè)時(shí)候參數(shù)是經(jīng)過(guò)加密的,所以在分析網(wǎng)易云接口的時(shí)候要了解它的加密過(guò)程,下面來(lái)看看怎么實(shí)現(xiàn)爬蟲(chóng)的整個(gè)過(guò)程。
Part1 進(jìn)行網(wǎng)頁(yè)分析
Part2 進(jìn)行數(shù)據(jù)包分析
Part3 請(qǐng)求分析
點(diǎn)擊請(qǐng)求頭,它這里利用的post請(qǐng)求,所以在瀏覽器地址欄直接打開(kāi)不會(huì)有對(duì)應(yīng)的信息
這里查看它附加攜帶的參數(shù),這里post請(qǐng)求攜帶了兩個(gè)參數(shù),一個(gè)是params,一個(gè)是enSecKey,這兩個(gè)參數(shù)經(jīng)過(guò)了加密,然后附帶給post請(qǐng)求發(fā)送給服務(wù)器。才能得到j(luò)son結(jié)果,這里體現(xiàn)了網(wǎng)易云的強(qiáng)大加密,經(jīng)過(guò)發(fā)現(xiàn),這里的params和enSecKey主要對(duì)音樂(lè)id的加密
分析加密過(guò)程,點(diǎn)擊發(fā)起程序,可以看到它的加密過(guò)程是由js加密的,在js代碼中搜索encSecKey關(guān)鍵詞定位到該部分,可以發(fā)現(xiàn)它的加密由asrsea函數(shù)加密
Part3 參數(shù)獲取
這里我們雖然不能解密它的過(guò)程,但是我們可以利用歌曲的id進(jìn)行加密,在python中調(diào)用它的js加密函數(shù),得到它的加密參數(shù),從而構(gòu)造參數(shù)請(qǐng)求,這里利用一首歌的id進(jìn)行加密得到的兩個(gè)參數(shù),得到了參數(shù)之后,我們就可以構(gòu)造post請(qǐng)求
這里利用得到的參數(shù)構(gòu)造post請(qǐng)求發(fā)送
得到了請(qǐng)求的數(shù)據(jù),里面含有url真實(shí)的播放地址
Part4 搜索分析
由搜索關(guān)鍵詞得到所有id,前面我們得到通過(guò)一首歌的id得到音樂(lè)播放url的真實(shí)地址,那么接下來(lái)我們?cè)趺赐ㄟ^(guò)搜索關(guān)鍵詞得到所有歌的id呢
3. 這里我們看它的請(qǐng)求url也是post請(qǐng)求,后面沒(méi)發(fā)現(xiàn)請(qǐng)求參數(shù),我們?nèi)タ纯此欠裼烧?qǐng)求參數(shù)
得到了加密參數(shù)后,我們就可以構(gòu)造post請(qǐng)求了
這里的話會(huì)返回所有歌曲的id的json數(shù)據(jù)包,就可以提取所有的id了
python代碼實(shí)現(xiàn)
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=[]#提取前三首的idfor 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_listdef geturl(songid):url_list=[]for i in range(3):id=songid[i]# 請(qǐng)求urlurl = '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__':#得到前三首歌的音樂(lè)idsongid,songname=getSongInfo(input("請(qǐng)輸入歌曲名字:\n"))urls=geturl(songid)for i in range(3):if(urls[i]):print(songname[i]+"\t\t\t"+urls[i])說(shuō)明:未經(jīng)作者許可,禁止轉(zhuǎn)載!!!如有侵權(quán),聯(lián)系作者刪除!!!
總結(jié)
- 上一篇: SQLite数据库如何存储和读取二进制数
- 下一篇: java弹框形式输入_java中点击一个