爬取酷狗音樂
- 分析問題
- 解決問題
- js逆向
- 代碼實作
- 總結
分析問題
1.酷狗音樂的地址保存在https://wwwapi.kugou.com/yy/index.php? 這個地址回傳的資料中

請求這個地址的引數

2.引數
r: play/getdata
callback: jQuery191030540823792922933_1618972923245
hash: CEDD87CFC9588BB0600921370B50E6E2
dfid: 08gUWM4PV0XU3XUgtx113XFW
mid: 601251b058f971d39776412d5fa2733b
platid: 4
album_id: 965528
_: 1618972923246
經過反復的請求,發現
r:不會改變
callback: 這個引數會改變,但需要洗掉,不會影響
hash: 隨著每首歌而改變
dfid:固定不變,與每臺電腦有關
mid: 固定不變,與每臺電腦有關
platid: 不會改變
album_id: 隨著每首歌而改變,對應的每首歌有關
_: 跟時間有關
因此需要獲取的引數是'_','album_id','hash'
解決問題
經過不斷的除錯,發現hash,album_id引數來自song地址回傳資料中

所以我們要請求這個地址

這個地址攜帶的引數

其中clienttime,mid,uuid是當前時間
signature引數是經過md5加密處理,
同時發現可以通過js逆向來分析signature生成

js逆向
signature = faultylabs.MD5(o.join("")),

打斷點
發現signature是由faultylabs.MD5函式生成

進入函式中,這是md5加密的函式

同時傳入函式的引數是json字串

代碼實作
import time
import execjs
import requests
import re
# 將js函式從網頁中保存下來,并通過呼叫execjs模塊生成signature
def fun(word): #word引數是json格式
with open("test.js", "r", encoding='utf-8') as f:
js_str = f.read()
# 通過js檔案中邏輯資料,對檔案進行加密
if js_str:
js_obj = execjs.compile(js_str)
return js_obj.call('faultylabs.MD5', word)
def get_id():
url = 'https://complexsearch.kugou.com/v2/search/song?'
keyword = input('請輸入需要下載的歌')
# 這是傳入js函式引數的一部分
key_code = "NVPh5oo715z5DIWAeQlhMDsWXXQV4hwtbitrate=0callback=callback123clienttime={time}clientver=2000dfid=-inputtype=0iscorrection=1isfuzzy=0keyword={keyword}mid={time}page=1pagesize=30platform=WebFilterprivilege_filter=0srcappid=2919tag=emuserid=-1uuid={time}NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"
p = key_code.format(time=millis, keyword=keyword) # js函式中的引數
ws = fun(p)
data = {
'callback': 'callback123',
'keyword': keyword,
'page': 1,
'pagesize': 30,
'bitrate': 0,
'isfuzzy': 0,
'tag': 'em',
'inputtype': 0,
'platform': 'WebFilter',
'userid': -1,
'clientver': 2000,
'iscorrection': 1,
'privilege_filter': 0,
'srcappid': 2919,
'clienttime': millis,
'mid': millis,
'uuid': millis,
'dfid': '-',
'signature': ws
}
wood=requests.get(url=url,headers=headers,params=data)
a=r'"AlbumID":"(.*?)"'
c=r'"FileHash":"(.*?)"'
t=r'"FileName":"(.*?)"'
wa=re.findall(a,wood.text) #歌手與歌名
wt=re.findall(t,wood.text) #id
hash_=re.findall(c,wood.text)#hash
print(hash_)
# print(wood.text)
# print(len(hash_))
item={}
for li in range(len(wa)):
print(wt[li].replace('<\\/em>','').replace('<em>',''),wa[li],hash_[li])
# 獲得13位時間戳
millis = str(round(time.time() * 1000))
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'
}
get_id()
結果
發現有些歌的id沒有,對這些歌請求,發現請求引數中沒有id

總結
爬取酷狗音樂分為兩步
第一步在搜索頁面中獲取hash,id等引數
第二步在播放頁面中,請求獲取歌的url地址
感謝沐沐沐沐朝陽
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/279386.html
標籤:python
