1. 程式人生 > 其它 >如何不用音樂播放器批量下載音樂?只需幾分鐘,Python輕鬆實現!

如何不用音樂播放器批量下載音樂?只需幾分鐘,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檔案了不,想要頁面好看,還得另外做個介面出來,下次整一個~