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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM