1. 程式人生 > 實用技巧 >python爬取酷我音樂

python爬取酷我音樂

我去!!!我之後一定按照搜尋方式下載歌曲~~~~~~~~~

1、首先開啟我們本次主講連結:http://www.kuwo.cn/

2、剛開始我就隨便點了一個地方,然後開始在後臺找歌曲的連結地址。但是這也使我分析頁面分析的很複雜。因為像在酷我音樂,這樣的模組都有一個pid,分析引數的時候找了半天還要找pid,,,結果發現這是一個固定值,那就沒有意義了,因為pid是一個固定值我總不能只去下載這個模組裡面的歌曲,,,想下載其他歌曲還要改程式碼,這樣子就不行了。。。。所以還是從搜尋框開始,搜尋到哪首歌曲,然後去看看下載哪個歌手唱的

3、酷我很狡猾,當我隨便搜尋一首歌,然後找這首歌的資料包的時候,如果你用這個資料包的請求頭直接在你的瀏覽器上訪問會出現403等錯誤,反正就是訪問不到。我找了半天也找不到,突然覺得酷我很牛掰。我去分析網易雲/QQ音樂的時候都沒有這個問題。

之後弄了半天才搞清楚,你只要加上一些請求頭資訊就可以訪問成功了。。。。

看來是我太。。。了

在pycharm上加上請求頭,在訪問就會成功。不只這個連結是這樣,酷我的好多連結訪問都要加上請求頭(我giao~~~),搞懂這個之後下面就不是問題了

4、因為這個資料包內包含了你搜索歌曲的這一頁所有的資訊,所以我們要把它爬下來,以便到時候選擇

5、之後我們播放歌曲,然後分析一下歌曲的播放連結,下面圖片上所顯示資料包的url欄位就是歌曲的url地址

6、之後我們就要分析一下它的請求頭

http://www.kuwo.cn/url?format=mp3&rid=283006&response=url&type=convert_url3&br=128kmp3&from=web&t=1596099527340&httpsStatus=1&reqId=e109c5d1-d242-11ea-84b1-4bd35f78cc6c

我giao,發現有好多引數,多播放幾首歌曲,發現rid,t,reqId欄位的值都不是固定的

本能以為就是在js檔案裡面生成的(可能爬取網易雲爬多了。。。),我找呀找,,,找呀找,,還是沒有找到(嗚嗚嗚~~~~~)

於是我特別迷茫,,特特特特別別別迷茫~~~~~~~~

最後才發現,t和reqId欄位雖然不是固定的,但是你可以把它當作固定的,,,,啊啊啊啊啊啊啊,服了,噁心人

於是就只需要找rid欄位的值就行了

我在搜尋框裡面找它,給我顯示沒有(???從此世界上又少了一個單純的人)rid都找到了,我們就分析一下這個資料包的請求頭

http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key=%E5%A4%95%E9%98%B3%E7%BA%A2&pn=1&rn=30&httpsStatus=1&reqId=7a39ffb0-d241-11ea-84b1-4bd35f78cc6c

很明顯key就是你要搜尋的內容,pn就是頁數,其他值還是當成固定值就行

我真的無語了,既然reqId可以當成固定值,那他還每次都變變變,不管哪個連結都有reqId,它還一直值都不一樣,,我真想說zang話

程式碼(程式碼也沒有整理,將就將就吧!)

import requests
import json

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}

headers1 = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Cookie': '_ga=GA1.2.1500987479.1595755923; _gid=GA1.2.568444838.1596065504; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1595755923,1596065505; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1596076178; kw_token=P5XA2TZXG9',
    'csrf': 'P5XA2TZXG9',
    'Host': 'www.kuwo.cn',
    'Referer': 'http://www.kuwo.cn/search/list?key=%E5%A4%95%E9%98%B3%E7%BA%A2',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}

headers2 = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Cookie': '_ga=GA1.2.1500987479.1595755923; _gid=GA1.2.568444838.1596065504; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1595755923,1596065505; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1596078189; _gat=1; kw_token=IJATWHHGI8',
    'csrf': 'IJATWHHGI8',
    'Host': 'www.kuwo.cn',
    'Referer': 'http://www.kuwo.cn/search/list?key=%E6%A2%A6%E7%9A%84%E5%9C%B0%E6%96%B9',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',

}

key_name = input('請輸入你要查詢的歌曲名稱:')
num = input('請輸入你要檢視歌曲列表第幾頁:')

url2 = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={}&pn={}&rn=30&httpsStatus=1&reqId=da11ad51-d211-11ea-b197-8bff3b9f83d2e'.format(key_name,num)

response = requests.get(url2,headers=headers2)  #訪問歌曲列表
print(response.text)
response.encoding = response.apparent_encoding  #這個apparent_encoding就是讓系統根據頁面來判斷用何種編碼
response = response.json()  # 得到josn字典dict
music_list = response["data"]["list"]  #得到歌曲列表
print("共計" + str(len(music_list)) + "結果: ")
all_singers = []  #放置所有歌手人名
names = []    #放置歌曲名字
all_rid = []    #放置所有rid,rid是網頁所需引數
a = 0
for music in music_list:
    #print(music)
    singer = music["artist"]  # 歌手名
    name = str(a) + "  " + music["name"]  # 歌曲名

    rid = music["musicrid"]     #取出rid,之後要對這個字串進行切割
    index = rid.find('_')
    rid = rid[index + 1:len(rid)]

    all_singers.append(singer)  #將對應資訊放到列表中
    names.append(name)
    all_rid.append(rid)
    a = a + 1
infs = dict(zip(names, all_singers))
infs = json.dumps(infs, ensure_ascii=False, indent=4, separators=(',', ':'))
infs = infs.replace('"', ' ')
infs = infs.replace(':', '——————')
print(infs)

order = input("請輸入歌曲前的序號:")

musicrid = all_rid[int(order)]
url1 = 'http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3&br=128kmp3&from=web&t=1596078536164&httpsStatus=1&reqId=01528151-d212-11ea-b197-8bff3b9f83d2'.format(musicrid)

res = requests.get(url1,headers=headers1)  #訪問歌曲列表
res.encoding = res.apparent_encoding
res = res.json()  # dict
res_url = res["url"]  #取出歌曲下載url地址

music = requests.get(res_url,headers=headers).content
with open(names[int(order)]+'.mp3','wb') as f:
    f.write(music)