如何不用音樂播放器批量下載音樂?只需幾分鍾,Python輕松實現!


我們想聽的歌,在特定音樂軟件才有,但是又嫌棄太麻煩,不想下載軟件,這個好說,Python隨隨便便就實現了!
在這里插入圖片描述
我們以湫湫音樂為例,做一個搜索下載音樂的功能。

在開始之前,給大家推薦一個交流的地方,有啥問題都可以在這交流~
很多小伙伴因為沒有好的學習資料或者遇到問題得不到高效解決,導致自己學習堅持不下去,所以我也在這准備了很多學習資料,大家都可以 點我免費領取 包括今天的代碼和視頻教程,對文章看不懂的話也可以看視頻。

用到的軟件是anaconda5.2.0(python3.6.5)和pycharm,anaconda是自帶Python的,安裝了anaconda就不用安裝Python了。

然后需要安裝一個requests庫,鍵盤按住win+r,在彈出的搜索框輸入cmd ,按回車 ,在新彈出的命令提示符窗口輸入 pip install requests 即可完成安裝。
在這里插入圖片描述
啰嗦了點,但是對零基礎友好一點。

知識點:

requests
json
pprint

OK,開始嘗試吧

先安排一下要用的模塊,導入進來。

import requests import json import os 

我們既然要爬一個網站,那么如果有反扒的話,肯定要解決這個問題,像今天可以用 headers 模塊來模擬成瀏覽器訪問網站。

那么 headers 在哪里找呢?

在瀏覽器頁面上點擊:右鍵–>檢查–>(或者直接按F12),剩余按照圖中顯示操作,需要按Fn+F5刷新出網頁來
在這里插入圖片描述

headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' } 

然后我們既然是要搜索下載的話,那不得先把搜索功能做出來。

def get_music_info():
    """搜索功能"""
    music_info_list = []
    name = input('請輸入歌手或歌曲:')  # 
    page = input('請輸入頁碼:')
    num = input('請輸入當前頁碼需要返回的數據條數:')
    url = f'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p={page}&n={num}&w={name}'
    response = requests.get(url, headers=headers).text  # 獲取到的是字符串
    # 將response切分成json格式 類似字典 但是現在還是字符串
    music_json = response[9:-1]
    # json轉字典
    music_data = json.loads(music_json)  # 轉換成 字典
    # print(music_data)
    music_list = music_data['data']['song']['list']
    for music in music_list:
        music_name = music['songname']  # 歌曲的名字
        singer_name = music['singer'][0]['name']  # 歌手的名字
        songmid = music['songmid']
        music_info_list.append((music_name, singer_name, songmid))
    return music_info_list

 

看看效果
在這里插入圖片描述

 

獲取加密的vkey

 

def get_purl(music_info_list):
    """單首歌曲地址拼接"""
    music_data = []
    for music in music_info_list:
        music_name = music[0]
        singer_name = music[1]
        songmid = music[2]
        url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"8846039534","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"8846039534","songmid":["%s"],"songtype":[0],"uin":"1152921504784213523","loginflag":1,"platform":"20"}},"comm":{"uin":"1152921504784213523","format":"json","ct":24,"cv":0}}' % songmid
        response = requests.get(url, headers=headers).json()  
        purl = response['req_0']['data']['midurlinfo'][0]['purl']
        full_media_url = 'http://dl.stream.qqmusic.qq.com/' + purl
        music_data.append(
            {
                'music_name': music_name,
                'singer_name': singer_name,
                'full_media_url': full_media_url
            })
    return music_data

 

如果你獲取的數據 是 {} .json() 他會直接幫我們轉換成字典。

然后實現下載

if 判斷是否有歌曲下載文件夾,如果沒有創建,就會自動創建一個歌曲下載文件夾。當然這個名字都可以自己改。

def save_music_mp3(music_data):
    """下載歌曲"""
    if not os.path.exists('歌曲下載'):  
        os.mkdir('歌曲下載')  
    for music in music_data:
        music_name = music['music_name']
        singer_name = music['singer_name']
        full_url = music['full_media_url']
        music_response = requests.get(full_url, headers=headers).content
        with open('歌曲下載/%s-%s.mp3' % (music_name, singer_name), 'wb')as fp:
            fp.write(music_response)
            print('[%s]保存成功!' % music_name)


if __name__ == '__main__':
    music_info_list = get_music_info()
    music_data = get_purl(music_info_list)
    save_music_mp3(music_data)

 

現在我們看看效果


在這里插入圖片描述

 

頁碼和數據條數可以不輸入,他會默認下載第一頁,一頁是十首歌。


你也可以你下載其他頁


在這里插入圖片描述

然后我只想要一首


在這里插入圖片描述

 

這是剛剛自動獲取到的歌曲


在這里插入圖片描述

當然,只用代碼多無趣,我們還可以實現把代碼打包,做成exe 程序,直接運行~

具體怎么做我就不一 一贅述了,方法簡單,百度一下分分鍾就做的出來。我給大家看下效果。
在這里插入圖片描述

雖然只有一個命令框頁面,單好歹也是個不用安裝Python也能運行的exe文件了不,想要頁面好看,還得另外做個界面出來,下次整一個~

在這里插入圖片描述


免責聲明!

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



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