生活随笔
收集整理的這篇文章主要介紹了
pytho_抓取下载音乐歌曲
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
抓取酷我音樂的流程
打開Chrome瀏覽器找到酷我音樂的首頁
先按F12調出chrome瀏覽器的調試工具
搜索歌曲,并且查看NextWord選項的抓包情況
通過尋找發現發送響應的url地址
打開文件并觀察里面的數據 發現是一個帶有json的數據網頁,嘗試打開這個json頁面卻發現請求錯誤404
發現不讓我們訪問有帶json界面的數據, 經過問候度娘在不知名的網頁中得知:有時候用戶不能訪問但是程序可以訪問, 然后試了一下使用python成功訪問:
獲取請求后繼續觀察url地址,查找不同的歌曲,并且查看url地址中的參數是否發生變化
觀察后得知 里面有2處地址發生變化,發生變化的位置已經用{}代替方便后續的參數傳遞
觀察從剛剛獲取請求的json數據后發現需要傳遞的參數都在json數據里面。先把請求好的str類型的html字符串使用json.loads()方法轉換為python能夠識別的內容 接下來就是按照字典提取數據的方法提取所需要的數據,
10.程序代碼如下:
import requests
import json
import os
class My_Music():def __init__(self
):print("*"*25+"音樂抓取器"+"*"*25)key_name
= input('*請輸入你要查找的歌曲名稱*:')num
= input('*請輸入你要查看歌曲列表第幾頁*:')self
.headers
= {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"}self
.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.1217877481.1602902461; h5Uuid=d48c2935f62740f1a5fb2a98c8a5c8-77; _gid=GA1.2.1687724501.1603190279; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1602902462,1602923878,1603190279; uname3=%5EO%5E; t3kwid=225768453; userid=225768453; websid=1015091557; pic3=\"http://q.qlogo.cn/qqapp/100243533/90AF896B7270476F63C06DE71F6BFCA4/100\"; t3=qq; _gat=1; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1603190370; kw_token=PLSZIEEDJSK","csrf": "PLSZIEEDJSK","Host": "www.kuwo.cn","Referer": "http://www.kuwo.cn/search/list?key=%E6%B8%B8%E5%B1%B1%E6%81%8B","User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",}self
.headers1
= {"Accept": "*/*","Accept-Encoding": "identity;q=1, *;q=0","Accept-Language": "zh-CN,zh;q=0.9","Connection": "keep-alive","Cookie": "_ga=GA1.2.1217877481.1602902461; h5Uuid=d48c2935f62740f1a5fb2a98c8a5c8-77; _gid=GA1.2.1687724501.1603190279; uname3=%5EO%5E; t3kwid=225768453; userid=225768453; websid=1015091557; pic3=\"http://q.qlogo.cn/qqapp/100243533/90AF896B7270476F63C06DE71F6BFCA4/100\"; t3=qq; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1602902462,1602923878,1603190279,1603192339; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1603192422","Host": "ey-sycdn.kuwo.cn","If-None-Match": "\"5f3faedb-350ce7\"","Range": "bytes=3145728-3476710","Referer": "https://ey-sycdn.kuwo.cn/15a6818d99191a29bc2ced51da173052/5f8ec8bc/resource/n3/65/71/2640215188.mp3","Sec-Fetch-Dest": "video","Sec-Fetch-Mode": "no-cors","Sec-Fetch-Site": "\"same-origin\"","User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",}self
.url1
= "http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3&br=128kmp3&from=web&t=1603196093062&httpsStatus=1&reqId=dbd3f971-12cd-11eb-984f-451e90d80fbc"self
.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
)self
.music_list
= []self
.all_singers
= []self
.names
= []self
.all_rid
= []def get_response(self
, url
, headers
, code
=True):response
= requests
.get
(url
=url
, headers
=headers
)if code
== True:return json
.loads
(response
.content
.decode
())elif code
== False:response
= requests
.get
(url
=url
, headers
=headers
)return response
.content
def json_html(self
, jos_html
, code
=True):if code
== True:with open("josn文件.json", "w") as f
:f
.write
(json
.dumps
(jos_html
, ensure_ascii
=False, indent
=4))else:with open("歌曲.mp3", "wb") as f
:f
.write
(jos_html
)def music_lists(self
, music_list
):a
= 0for music
in music_list
:self
.music_list
.append
(music
)self
.all_singers
.append
(music
["artist"])a
+= 1self
.names
.append
(str(a
)+" "+music
["name"])self
.all_rid
.append
(music
["musicrid"].split
("_")[-1])return self
.music_list
, self
.all_singers
, self
.names
, self
.all_rid
def get_song_url(self
, name
, singers
, all_rid
):infs
= dict(zip(name
, singers
))infs
= json
.dumps
(infs
, ensure_ascii
=False, indent
=0, separators
=(',', ':'))infs
= infs
.replace
('"', ' ')infs
= infs
.replace
(':', '——————')print(infs
.split
("{")[-1].split
("}")[0].replace
(",", ""))order
= int(input("*請輸入歌曲前的序號*:"))order
-= 1musicrid
= all_rid
[order
]url
= self
.url1
.format(musicrid
)music_url
= self
.get_response
(url
, self
.headers2
)return music_url
, order
def music_song(self
, song
,file_names
, singers
):self
.file()name
= str(file_names
)+"---"+str(singers
)file_name
= "歌曲庫//"+name
.split
(" ")[-1]+".mp3"with open(file_name
, "wb") as f
:f
.write
(song
)print(file_name
.split
("//")[-1],"下載保存成功!")def file(self
):"""判斷當前文件是否存在"""path
= "歌曲庫"if not os
.path
.exists
(path
):os
.mkdir
(path
)print(path
.split
("/")[-1], ":創建成功")def run(self
):music_json
= self
.get_response
(self
.url2
, self
.headers2
)self
.json_html
(music_json
)music_list
= music_json
["data"]["list"]print("當前頁面有", len(music_list
), "支歌曲:")content
, singers
, name
, all_rid
= self
.music_lists
(music_list
)music_url
, orid
= self
.get_song_url
(name
, singers
, all_rid
)song
= music_url
["url"]singer
= self
.get_response
(song
, self
.headers
, code
=False)self
.music_song
(singer
, name
[int(orid
)], singers
[int(orid
)])if __name__
== '__main__':while True:try:music
= My_Music
()music
.run
()except ValueError
:print("歌曲下載錯誤,歌曲序號請輸入整數!")except requests
.exceptions
.ConnectionError
:print("網絡連接錯誤,請檢查網絡連接!")print("程序退出")breakexcept Exception
as f
:print("網絡連接超時,請重啟檢測網絡通暢性!")
總結
以上是生活随笔為你收集整理的pytho_抓取下载音乐歌曲的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。