python爬取收费音乐_想下载的歌曲太多?嫌麻烦?要付费?戳这,帮你解决---Python爬取酷狗音乐...
目錄1.前言
2.分析一下1.
2.
3.
3.代碼解釋
4.完整代碼
5.結(jié)語(yǔ)
1.前言
前面發(fā)布了一篇關(guān)于QQ音樂(lè)爬取的教程,但對(duì)于我們這種文藝青年來(lái)說(shuō),一個(gè)平臺(tái)的歌曲怎么夠我們聽(tīng)的,也是因?yàn)槊總€(gè)平臺(tái)歌曲的權(quán)限不同,所以不同平臺(tái)也有不同的歌曲,今天,給大家?guī)?lái)爬取酷狗音樂(lè)的教程,就是歌多!!!
2.分析一下
我們大家聽(tīng)歌的時(shí)候大都是去搜喜歡的歌曲名或者是喜歡的歌手,那今天我們就以歌手為例,下載搜索歌手出現(xiàn)的歌曲列表,如下。
我們就是要下載列表中的全部歌曲。
1.
首先我們分析一下,我們執(zhí)行代碼時(shí),改變的肯定是歌手名,就是當(dāng)我們輸入歌手的名字時(shí),它會(huì)獲取到有關(guān)這個(gè)列表的所有歌曲的信息,所以我們要從搜索部分入手。
如圖:當(dāng)我們?cè)谒阉骺蜉斎胄畔r(shí),每按一次鍵盤就會(huì)出現(xiàn)一個(gè)文件,當(dāng)我們搜索完,按回車時(shí),會(huì)發(fā)現(xiàn)一個(gè)文件,這個(gè)文件包含了這個(gè)列表的所有信息,也就是所搜索歌手的全部歌曲,而且每一項(xiàng)都包含了這首歌曲的詳細(xì)信息,但遺憾的是沒(méi)有這首歌曲的播放地址,沒(méi)關(guān)系,至少我們的方向是對(duì)的。
我們分析這個(gè)文件的地址:
https://songsearch.kugou.com/song_search_v2?callback=jQuery112405886208845288214_1588464073802&keyword=%E6%B1%AA%E8%8B%8F%E6%B3%B7&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1588464073826
這應(yīng)該是經(jīng)過(guò)地址編碼的,我們轉(zhuǎn)碼看一下:
https://songsearch.kugou.com/song_search_v2?callback=jQuery112405886208845288214_1588464073802&keyword=汪蘇瀧&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1588464073826
看到變化了嗎,沒(méi)錯(cuò),關(guān)鍵字"keyword"就是歌手名,我們改變地址中的keyword就可以得到,不同歌手的歌曲列表
2.
既然我們找到了歌曲的詳細(xì)信息,就要分析信息中哪些是我們想要的,但在此之前,我們得找到歌曲的其他信息,不然一處信息是無(wú)法判斷的。我們點(diǎn)開(kāi)一首歌曲,檢查一下,我們可以看到這樣一個(gè)文件。
這個(gè)文件包也是包含了歌曲的詳細(xì)信息,但重要的是,有一個(gè)可疑的地址,我們點(diǎn)開(kāi)來(lái)看,猜對(duì)了,就是歌曲的播放地址,哈哈,是不是信心大增。
3.
如果只看播放地址的話我們發(fā)現(xiàn)不了什么規(guī)律,那我們看一看這個(gè)文件的地址,多看幾個(gè),沒(méi)準(zhǔn)你會(huì)有新的發(fā)現(xiàn)。
仔細(xì)看一看,發(fā)沒(méi)發(fā)現(xiàn)兩個(gè)關(guān)鍵字,“hash"和"album_id”,是不是覺(jué)得和我們前面發(fā)現(xiàn)的信息有聯(lián)系啊,沒(méi)錯(cuò),我們最開(kāi)始分析的那個(gè)文件中,歌曲的詳細(xì)信息里就包含了這兩個(gè)關(guān)鍵字的值。
所以獲取歌曲播放地址的步驟我們大致也明白了,我們可以根據(jù)我們分析的第一個(gè)文件中的"hash"和"album_id"來(lái)獲取我們分析的第二個(gè)文件的地址,第二個(gè)文件包含了歌曲的播放地址,所以,好吧,圖解一下。
這下應(yīng)該很非常清楚了吧,光看圖也該明白了吧!!!
3.代碼解釋
再給你們稍微說(shuō)明一下。
我們根據(jù)歌手搜索時(shí),參數(shù)歌手名是字符串類型,但帶到地址中要進(jìn)行編碼轉(zhuǎn)換。
調(diào)入模塊:
import urllib.request,urllib.error,urllib.parse
代碼部分:
code_name = urllib.parse.quote(name) #字符串轉(zhuǎn)化為編碼格式
獲取歌手的歌曲列表,這是圖解的第一步,注釋部分是根據(jù)搜索的歌名獲取歌曲列表,也就是一首歌曲的不同演唱版本,使用時(shí)只需要將上面的地址注釋就可以了
代碼:
music_list = "https://songsearch.kugou.com/song_search_v2?callback=jQuery112405886208845288214_1588464073802&keyword=%s&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1588464073804" % code_name #獲取歌名產(chǎn)生的歌曲列表 下載列表全部
# music_list = "https://songsearch.kugou.com/song_search_v2?callback=jQuery112406527023765769748_1588091726282&keyword=%s&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1588091726284" % code_name #搜索歌手產(chǎn)生的歌曲列表 下載列表全部
獲取帶有歌曲播放地址的文件的地址,這是圖解的第三步:
代碼:
information_url = "https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19101144344902676131_1588093696865&hash={}&album_id={}&dfid=2AHvg428HZSx0oRNWX0prTMo&mid=4b42424f9fa4d173c4601c6b476003f2&platid=4&_=1588093696867".format(music_hash,music_albumid)
獲取歌曲的播放地址,這是圖解的最后一步:
代碼:
music_url = cut_dict["data"]["play_url"]
分析一下的目的就是讓你們?cè)诳赐暾a的時(shí)候沒(méi)有那么懵,結(jié)合我們分析的步驟,和每段代碼的作用,完整看一遍代碼,很容易理解。
4.完整代碼
import requests
import re
import json
import os
import urllib.request,urllib.error,urllib.parse
import time
headers = {"cookie": "kg_mid=4b42424f9fa4d173c4601c6b476003f2; kg_dfid=2AHvg428HZSx0oRNWX0prTMo; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1587913892,1588084386; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; kg_mid_temp=4b42424f9fa4d173c4601c6b476003f2; Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1588093697",
"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"}
content_url_list = []
def get_url(name):
code_name = urllib.parse.quote(name) #字符串轉(zhuǎn)化為編碼格式
music_list = "https://songsearch.kugou.com/song_search_v2?callback=jQuery112405886208845288214_1588464073802&keyword=%s&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1588464073804" % code_name #獲取歌名產(chǎn)生的歌曲列表 下載列表全部
# music_list = "https://songsearch.kugou.com/song_search_v2?callback=jQuery112406527023765769748_1588091726282&keyword=%s&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1588091726284" % code_name #搜索歌手產(chǎn)生的歌曲列表 下載列表全部
music_list_response = requests.get(music_list,headers=headers,).text
music_list_html = re.findall(r'\((.*)\)',music_list_response)[0]
music_list_html_dict = json.loads(music_list_html)
for i in range(len(music_list_html_dict["data"]["lists"])):
music_hash = music_list_html_dict["data"]["lists"][i]["FileHash"] #關(guān)鍵字 hash
music_albumid = music_list_html_dict["data"]["lists"][i]["AlbumID"] #關(guān)鍵字album_id
information_url = "https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19101144344902676131_1588093696865&hash={}&album_id={}&dfid=2AHvg428HZSx0oRNWX0prTMo&mid=4b42424f9fa4d173c4601c6b476003f2&platid=4&_=1588093696867".format(music_hash,music_albumid)
content_url_list.append(information_url) #包含歌曲詳細(xì)信息
return content_url_list
def Preservation(sid):
url = sid
response = requests.get(url,headers=headers).text
time.sleep(3) #時(shí)間延遲 控制爬蟲爬取速度
cut_json = re.findall(r'\((.*)\)',response)[0] #格式為json格式
cut_dict = json.loads(cut_json) #轉(zhuǎn)換為字典格式 才能根據(jù)鍵獲取值
music_url = cut_dict["data"]["play_url"] #歌曲播放地址
music_name = cut_dict["data"]["song_name"] #歌曲名
singer = cut_dict["data"]["author_name"] #歌手名
data_url = "D:/Pycharm文件/網(wǎng)絡(luò)爬蟲/酷狗音樂(lè)/"
data_name = data_url + music_name + "_____" + singer + ".mp3"
content_url = requests.get(music_url,headers=headers).content
try:
if not os.path.exists(data_url): #判斷有誤文件夾
os.mkdir(data_url)
if not os.path.exists(data_name): #判斷有無(wú)文件
print("正在下載 %s" % (music_name + "---" + singer))
with open(data_name,"wb") as f:
f.write(content_url)
print(" %s 下載成功" % (music_name + "---" + singer))
else:
print("文件已存在")
except:
print("下載失敗")
for sid in get_url("不分手的戀愛(ài)"): # 當(dāng)沒(méi)有版權(quán)時(shí)是沒(méi)有play_url的 這部分要修改
Preservation(sid)
time.sleep(2) #時(shí)間延遲 控制爬蟲訪問(wèn)服務(wù)器時(shí)間 避免過(guò)快被反爬
5.結(jié)語(yǔ)
這次,我感覺(jué)寫的挺詳細(xì)了,當(dāng)然只是我自己覺(jué)得(嘻嘻),有什么意見(jiàn)或建議都可以私信我,我會(huì)努力改正,代碼有不足的地方還請(qǐng)指點(diǎn),我也會(huì)努力改正,我們一起加油呀。對(duì)了,別忘了多多支持我呀(嘻嘻)。
總結(jié)
以上是生活随笔為你收集整理的python爬取收费音乐_想下载的歌曲太多?嫌麻烦?要付费?戳这,帮你解决---Python爬取酷狗音乐...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为啥要xargs
- 下一篇: python爬取付费音乐包_python