我去!!!我之后一定按照搜索方式下載歌曲~~~~~~~~~
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)