【Python】requests庫爬蟲實戰之爬取音樂(保姆級圖文+詳細代碼注釋+完整項目代碼)


@


歡迎關注 『Python』 系列,持續更新中
歡迎關注 『Python』 系列,持續更新中

爬蟲實戰之免費爬取付費音樂(保姆級圖文+詳細代碼注釋+完整項目代碼)
免責聲明:本文的初衷是學習爬蟲知識的一個實例,通過程序下載的版權音樂24小時侵刪。

你是不是在pc端上經常遇到這種情況——音樂無法下載,必須下載客戶端才能下載?
爬蟲可以解決這個麻煩!

API說明:

response=requests.get(參數1,headers=參數2)

  • 參數1:url 存放被爬取的網頁url地址
  • 參數2:可選參數,訪問頭,模擬瀏覽器訪問信息
  • 返回值:200表示爬取解析網頁成功

注意事項

  1. 用了反爬機制,自定義headers
  2. time模塊用於獲取當前時間,給文件命名,其實也可以爬取歌曲名字來命令下載好的歌曲文件(給大家提供一個思路)
  3. 因為這只是學習測試,只支持單個歌曲的下載,很簡陋,嚴禁使用本程序大面積下載收費音樂營利!

如何獲取音樂MP3下載地址

爬取數據的前提首先是別人讓你爬取才行,問題在於找到音樂文件的下載地址!
我們先從免費歌曲開始(付費歌曲在免費歌曲的基礎上演變而來)

免費歌曲

谷歌瀏覽器右鍵檢查(有些瀏覽器叫審查元素)
在新打開的這個頁面中選擇網絡(network)選項卡,點擊刷新(如果你之后下載第二首音樂不刷新的話總是顯示第一首音樂)
在這里插入圖片描述
隨便找一首歌曲:http://www.kuwo.cn/play_detail/197789527打開網頁
在這里插入圖片描述
在這個網絡窗口中按F5刷新,注意確保音樂播放的歌曲是你想要的歌曲
你會發現原來空白的網絡多了很多東西
然后搜索MP3,找到playurl
在這里插入圖片描述
右鍵,在新標簽頁中打開
在這里插入圖片描述
到這里,我們得到了一個存放MP3文件地址的json地址
http://www.kuwo.cn/api/v1/www/music/playUrl?mid=197789527&type=music&httpsStatus=1&reqId=23762b30-5e0f-11ec-857c-dfb0b0613858
在這里插入圖片描述
得到了音樂的下載地址
https://cr-sycdn.kuwo.cn/6ca645b59ddbbda92b20cb7484ce8d60/61ba9655/resource/n2/50/97/3993078800.mp3

{
  "code": 200,
  "msg": "success",
  "reqId": "a50a453b634c48f7c8b34f155e1b9112",
  "data": {
    "url": "https://cr-sycdn.kuwo.cn/6ca645b59ddbbda92b20cb7484ce8d60/61ba9655/resource/n2/50/97/3993078800.mp3"
  },
  "profileId": "site",
  "curTime": 1639618133536,
  "success": true
}

在這里插入圖片描述

付費歌曲

和免費歌曲類似,但是你會發現無法獲取到他的playurl!
做法:你先獲取到一個免費歌曲的存放MP3文件地址的json地址
http://www.kuwo.cn/api/v1/www/music/playUrl?mid=197789527&type=music&httpsStatus=1&reqId=23762b30-5e0f-11ec-857c-dfb0b0613858
你可以多試試幾首歌曲,你會發現這里的mid參數是歌曲的一個標志參數
那么你把免費歌曲的mid參數換成付費的試試看:(把197789527換成了228908)
https://www.kuwo.cn/api/v1/www/music/playUrl?mid=228908&type=music&httpsStatus=1&reqId=23762b30-5e0f-11ec-857c-dfb0b0613858
在這里插入圖片描述
把其中的type=music改變成type=mp3
https://www.kuwo.cn/api/v1/www/music/playUrl?mid=228908&type=mp3&httpsStatus=1&reqId=23762b30-5e0f-11ec-857c-dfb0b0613858出現了MP3的下載地址
在這里插入圖片描述

下載歌曲

打開MP3地址
在這里插入圖片描述
在這里插入圖片描述

requests解析網頁例程

注意這里的MP3的url會隨時間過期變化,你要通過前面的教程自己手動獲取!

#1.看響應參數是不是200判斷url是否能訪問
import requests
print("1.看響應參數是不是200判斷url是否能訪問")
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
    'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
    'csrf': 'RUJ53PGJ4ZD',
    'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1577029678,1577034191,1577034210,1577076651; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1577080777; kw_token=RUJ53PGJ4ZD'
}
response=requests.get("https://other-web-ra01-sycdn.kuwo.cn/1647fce2c2c049bf4ef8462545763e61/61ba7d80/resource/n2/128/98/58/4249925507.mp3",headers=headers)
print(response)

根據MP3地址下載音樂例程

注意這里的MP3下載的url會隨時間過期變化,你要通過前面的教程自己手動獲取!

#2.試着根據黃昏音樂MP3地址url解析成功的結果下載一首音樂,存放在本程序目錄下
import requests
print("2.試着根據音樂MP3地址url解析成功的結果下載一首音樂,存放在本程序目錄下")
#注意這里的MP3的url會隨時間過期變化,你要通過前面的教程自己手動獲取!
with open("下載的一首歌曲.mp3","wb") as file:
    url="https://other-web-ra01-sycdn.kuwo.cn/1647fce2c2c049bf4ef8462545763e61/61ba7d80/resource/n2/128/98/58/4249925507.mp3"
    music = requests.get(url)#獲取解析到的數據
    file.write(music.content)#把數據寫入緩沖區文件
    file.flush()#把數據存入緩沖區
    file.close()#關閉文件

下圖情況有可能是因為url有時效性,我的url你肯定用不了,你得通過上面的獲取url教程自己手動獲取。
在這里插入圖片描述


完整實戰:根據音樂播放地址下載音樂例程

隨便找一個音樂的播放網址:http://www.kuwo.cn/play_detail/197789527
在這里插入圖片描述
下載成功
在這里插入圖片描述

#3.輸入一首歌曲的地址(不是MP3地址),解析得到音樂,完整項目
import time
import requests
print("3.輸入一首歌曲的地址(不是MP3地址),解析得到音樂")
def get_mp3_name():
    data_time=time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime())#格式化獲取的當地時間
    mp3_name=data_time+".mp3"
    return mp3_name
def downMusic(url):
    # 該網站有反爬機制,要模擬瀏覽器來進行偽裝。
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
        'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
        'csrf': 'RUJ53PGJ4ZD',
        'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1577029678,1577034191,1577034210,1577076651; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1577080777; kw_token=RUJ53PGJ4ZD'
    }

    mid=url.split("/")[-1]#假設url是http://www.kuwo.cn/play_detail/196835141,得到mid196835141
    #把得到的mid參數填入指定位置得到了存放MP3文件地址的json地址
    save_mp3_url="http://www.kuwo.cn/api/v1/www/music/playUrl?mid=%s&type=mp3&httpsStatus=1&reqId=66231ca1-5e04-11ec-96d1-d1bbc17ab269" % mid
    mp3_response=requests.get(save_mp3_url,headers=headers)#解析存放MP3文件地址的json地址
    mp3_url =mp3_response.json().get("data").get("url")#根據解析存放MP3文件地址的json地址的內容,獲取MP3地址
    with open(get_mp3_name(), "wb") as file:
        music = requests.get(mp3_url,headers=headers)  # 獲取解析到的數據
        file.write(music.content)  # 把數據寫入緩沖區文件
        file.flush()  # 把數據存入緩沖區
        file.close()  # 關閉文件

url = input("輸入一首歌曲的播放地址下載歌曲:")
downMusic(url)

完整學習例程

# @Time    : 2021/12/16 7:15
# @Author  : 南黎
# @FileName: 爬取音樂程序.py


#測試時如果發現歌曲地址解析得到的不是自己想要的歌曲,可能是因為你沒有刷新網頁的解析結果導致!
#這些地址僅供學習參考,會隨時間過期,授人以魚不如授人以漁

#免費歌曲(以下地址有部分會隨時間變化,主要是提供一個思路)
#金玉良緣 歌曲播放地址:http://www.kuwo.cn/play_detail/196835141
#金玉良緣 歌曲播放id: 196835141
#金玉良緣 歌曲MP3地址的存放地址: http://www.kuwo.cn/api/v1/www/music/playUrl?mid=196835141&type=music&httpsStatus=1&reqId=66231ca1-5e04-11ec-96d1-d1bbc17ab269
#金玉良緣 歌曲MP3地址: https://other-web-nf01-sycdn.kuwo.cn/593dddbc7e2c3d8e42c3ad0349ec219b/61ba83b5/resource/n3/68/45/237017447.mp3

#收費歌曲
#你會發現無法獲取到網頁的playurl
#黃昏 歌曲播放地址:http://www.kuwo.cn/play_detail/1044318
#黃昏 歌曲播放id: 1044318
#黃昏 歌曲MP3地址的原來的存放地址: http://www.kuwo.cn/api/v1/www/music/playUrl?mid=1044318&type=music&httpsStatus=1&reqId=66231ca1-5e04-11ec-96d1-d1bbc17ab269
#黃昏 歌曲MP3地址的修改后存放地址: https://www.kuwo.cn/api/v1/www/music/playUrl?mid=1044318&type=mp3&httpsStatus=1&reqId=66231ca1-5e04-11ec-96d1-d1bbc17ab269
#黃昏 歌曲MP3地址: https://other-web-ra01-sycdn.kuwo.cn/9613a15eacfc54710a0762b566b3235a/61ba850e/resource/n2/128/98/58/4249925507.mp3

#1.看響應參數是不是200判斷url是否能訪問
import requests
print("1.看響應參數是不是200判斷url是否能訪問")
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
    'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
    'csrf': 'RUJ53PGJ4ZD',
    'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1577029678,1577034191,1577034210,1577076651; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1577080777; kw_token=RUJ53PGJ4ZD'
}
response=requests.get("https://other-web-ra01-sycdn.kuwo.cn/1647fce2c2c049bf4ef8462545763e61/61ba7d80/resource/n2/128/98/58/4249925507.mp3",headers=headers)
print(response)

# 2.試着根據黃昏音樂MP3地址url解析成功的結果下載一首音樂,存放在本程序目錄下
import requests
print("2.試着根據音樂MP3地址url解析成功的結果下載一首音樂,存放在本程序目錄下")
#注意這里的url會隨時間過期變化,你要通過前面的教程自己手動獲取!
with open("下載的一首歌曲.mp3","wb") as file:
    url="https://other-web-ra01-sycdn.kuwo.cn/1647fce2c2c049bf4ef8462545763e61/61ba7d80/resource/n2/128/98/58/4249925507.mp3"
    music = requests.get(url)#獲取解析到的數據
    file.write(music.content)#把數據寫入緩沖區文件
    file.flush()#把數據存入緩沖區
    file.close()#關閉文件

#3.輸入一首歌曲的地址(不是MP3地址),解析得到音樂,完整項目
import time
import requests
print("3.輸入一首歌曲的地址(不是MP3地址),解析得到音樂")
def get_mp3_name():
    data_time=time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime())#格式化獲取的當地時間
    mp3_name=data_time+".mp3"
    return mp3_name
def downMusic(url):
    # 該網站有反爬機制,要模擬瀏覽器來進行偽裝。
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
        'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
        'csrf': 'RUJ53PGJ4ZD',
        'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1577029678,1577034191,1577034210,1577076651; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1577080777; kw_token=RUJ53PGJ4ZD'
    }

    mid=url.split("/")[-1]#假設url是http://www.kuwo.cn/play_detail/196835141,得到mid196835141
    #把得到的mid參數填入指定位置得到了存放MP3文件地址的json地址
    save_mp3_url="http://www.kuwo.cn/api/v1/www/music/playUrl?mid=%s&type=mp3&httpsStatus=1&reqId=66231ca1-5e04-11ec-96d1-d1bbc17ab269" % mid
    mp3_response=requests.get(save_mp3_url,headers=headers)#解析存放MP3文件地址的json地址
    mp3_url =mp3_response.json().get("data").get("url")#根據解析存放MP3文件地址的json地址的內容,獲取MP3地址
    with open(get_mp3_name(), "wb") as file:
        music = requests.get(mp3_url,headers=headers)  # 獲取解析到的數據
        file.write(music.content)  # 把數據寫入緩沖區文件
        file.flush()  # 把數據存入緩沖區
        file.close()  # 關閉文件

url = input("輸入一首歌曲的播放地址下載歌曲:")
downMusic(url)


總結

大家喜歡的話,給個👍,點個關注!繼續跟大家分享敲代碼過程中遇到的問題!

版權聲明:

發現你走遠了@mzh原創作品,轉載必須標注原文鏈接

Copyright 2021 mzh

Crated:2021-12-16

歡迎關注 『Python』 系列,持續更新中
歡迎關注 『Python』 系列,持續更新中
【Python安裝第三方庫一行命令永久提高速度】
【使用PyInstaller打包Python文件】
【更多內容敬請期待】



免責聲明!

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



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