我們想聽的歌,在特定音樂軟件才有,但是又嫌棄太麻煩,不想下載軟件,這個好說,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文件了不,想要頁面好看,還得另外做個界面出來,下次整一個~