网易云音乐接口解析
我們都知道,爬蟲網易云音樂時候參數是經過加密的,所以在分析網易云接口的時候要了解它的加密過程,下面來看看怎么實現爬蟲的整個過程。
Part1 進行網頁分析
Part2 進行數據包分析
Part3 請求分析
點擊請求頭,它這里利用的post請求,所以在瀏覽器地址欄直接打開不會有對應的信息
這里查看它附加攜帶的參數,這里post請求攜帶了兩個參數,一個是params,一個是enSecKey,這兩個參數經過了加密,然后附帶給post請求發送給服務器。才能得到json結果,這里體現了網易云的強大加密,經過發現,這里的params和enSecKey主要對音樂id的加密
分析加密過程,點擊發起程序,可以看到它的加密過程是由js加密的,在js代碼中搜索encSecKey關鍵詞定位到該部分,可以發現它的加密由asrsea函數加密
Part3 參數獲取
這里我們雖然不能解密它的過程,但是我們可以利用歌曲的id進行加密,在python中調用它的js加密函數,得到它的加密參數,從而構造參數請求,這里利用一首歌的id進行加密得到的兩個參數,得到了參數之后,我們就可以構造post請求
這里利用得到的參數構造post請求發送
得到了請求的數據,里面含有url真實的播放地址
Part4 搜索分析
由搜索關鍵詞得到所有id,前面我們得到通過一首歌的id得到音樂播放url的真實地址,那么接下來我們怎么通過搜索關鍵詞得到所有歌的id呢
3. 這里我們看它的請求url也是post請求,后面沒發現請求參數,我們去看看它是否由請求參數
得到了加密參數后,我們就可以構造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=[]#提取前三首的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]# 請求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__':#得到前三首歌的音樂idsongid,songname=getSongInfo(input("請輸入歌曲名字:\n"))urls=geturl(songid)for i in range(3):if(urls[i]):print(songname[i]+"\t\t\t"+urls[i])說明:未經作者許可,禁止轉載!!!如有侵權,聯系作者刪除!!!
總結
- 上一篇: SQLite数据库如何存储和读取二进制数
- 下一篇: java弹框形式输入_java中点击一个