1. 程式人生 > >通過手動新增id從雲音樂介面一鍵下載音樂(Python3實現)

通過手動新增id從雲音樂介面一鍵下載音樂(Python3實現)

  首先,談論下思路和準備工作。

  思路是,先去網易雲音樂平臺試試水,看看各大音樂庫是否“有機可乘”。當然這過程是用谷歌Network監控瀏覽器與伺服器互動請求,如下圖:

  結果發現,果然是大廠,竟然把相關的有歌曲重要資訊的json都給遮蔽了。

  可以看到裡面都是些無關緊要的東西:

  通過網路一些博主,瞭解到了一些有用的介面,可以直接獲取歌曲資訊,比如這個:

還有這個

結果發現,前者的重要欄位mp3Url缺失values值,而後者依賴song_id,沒有id無法獲取對應資訊。

如圖:

--沒有輸入id的情況:

  我們要獲取什麼資訊呢,主要是歌曲下載連結,歌曲id,歌詞下載連結,之類的~

  那麼完整流程是這樣的:獲取歌曲id,以獲取下載連結,若能獲取歌曲名最好,不能則命名,通過程式批量下載到指定資料夾,以新命名的名字儲存。

放下程式碼:

...
r = requests.get('https://music.163.com/api/playlist/detail?id=10169002') 
arr = r.json()['result']['tracks']   #熱歌榜歌
# mp3_id = arr[i]['id']  #API變更,現在從id入手
# mp3_id = 27808044  #測試專用~~

這裡的http獲取連結是測試連結,是  #香港電臺音樂龍虎榜

通過瀏覽器開發者選項(Chrome裡)可看到json 的封裝層次:

需要注意的是:重新整理才可看到此請求

我們展開它,得到下圖:

按照程式碼邏輯,這樣mp3_id可以正常獲取到,但是筆者發現有點尷尬的是,只要是熱榜的歌曲,就算有歌曲id了,但是獲取不了,url。舉個列子:

圖中青春終老的id:574963447

去介面檢視url:很遺憾是空的

無奈,只能去非熱榜摳出歌曲id,但是非熱榜沒有查出對應介面可以列出全部歌曲id,

所以這些準備沒有用。只能通過美麗湯(BeautifulSoup)過濾或者,手動錄入。這裡筆者尚未用過美麗湯,暫時手動錄入。

於是有了:

L = [1294910785,32507038,557583281,557581967,471385043,574921549,415792881,417859631,27955653,27890306,
32192436,516657051,571340283,468517654,27955658,27955654,35528482,515803379,474567044,525241230,553543014,
466122271,27955656,518894283,412902689,32507039,27955652,169140,169137,429450375]  #在薛之謙#個人專輯錄入

for i in range(30):
	print(L[i])

for mp3_id in L:   
	# name = str(i+1) + ' ' + arr[i]['name'] + '.mp3'
	n = len(L)
	n = n - 1
	global name
	name = str(mp3_id) + '_薛之謙.mp3'
	apiUrl = 'http://music.163.com/api/song/enhance/download/url?br=320000&id=' + str(mp3_id)  #可以通過apiUrl查到Mp3的url
	print('apiUrl = ' + apiUrl)
	# print(name)


	# mp3_id = arr[i]['id']  #API變更,現在從id入手
	# mp3_id = 27808044  #測試專用~~
	newr = requests.get(apiUrl)

這裡可以看到是另命名的方式命名歌曲,以id+薛之謙.mp3命名,

newr可以獲取到單個歌曲的歌曲資訊,

通過正常的字典操作,獲取url

這樣就可以順利下載了。這裡因為已經下載就不下載了,複製程式碼檔案到其它目錄,dos環境下切換到此目錄,執行:

----

好的,收工。

放下完整程式碼:

# -*- coding: utf8 -*-

'this is a greate beginning'
__author__ = 'Hardy'
#python3.7.0

########import this
import requests   #注意request庫和requests有根本區別,!去python.org官網的pypi裡下載正確的庫
import urllib

test = 'test'
#網易雲音樂下載-python爬蟲嘗試
#榜單歌曲批量下載
# r = requests.get('https://music.163.com/discover/toplist?id=19723756')  #雲音樂飆升榜
# r = requests.get('https://music.163.com/api/playlist/detail?id=3779629')   #雲音樂新歌榜
# r = requests.get('https://music.163.com/api/playlist/detail?id=2884035')   #網易原創歌曲榜
# r = requests.get('https://music.163.com/api/playlist/detail?id=3778678')   #雲音樂熱歌榜
r = requests.get('https://music.163.com/api/playlist/detail?id=10169002')  #香港電臺音樂龍虎榜
# r = requests.get('https://music.163.com/api/playlist/detail?id=2250011882')  #抖音排行榜

#歌單歌曲批量下載
# r = requests.get('https://music.163.com/api/playlist/detail?id=2388322013')   #最是粵語最為情深 也唯獨你最難忘懷
# r = requests.get('https://music.163.com/api/playlist/detail?id=118289341')    #♫鄉村音樂你是如此好聽

arr = r.json()['result']['tracks']   #熱歌榜歌
L = [1294910785,32507038,557583281,557581967,471385043,574921549,415792881,417859631,27955653,27890306,
32192436,516657051,571340283,468517654,27955658,27955654,35528482,515803379,474567044,525241230,553543014,
466122271,27955656,518894283,412902689,32507039,27955652,169140,169137,429450375]
for i in range(30):
	print(L[i])

for mp3_id in L:   
	# name = str(i+1) + ' ' + arr[i]['name'] + '.mp3'
	n = len(L)
	n = n - 1
	global name
	name = str(mp3_id) + '_薛之謙.mp3'
	apiUrl = 'http://music.163.com/api/song/enhance/download/url?br=320000&id=' + str(mp3_id)  #可以通過apiUrl查到Mp3的url
	print('apiUrl = ' + apiUrl)
	# print(name)


	# mp3_id = arr[i]['id']  #API變更,現在從id入手
	# mp3_id = 27808044  #測試專用~~
	newr = requests.get(apiUrl)

	s = str(mp3_id)
	if s == '':
		print('error,now we can\'t download it')
	else:
		n_arr = newr.json()['data']['url']    #這裡正常情況下可以獲取url
		if n_arr != '':
			link = n_arr
			urllib.request.urlretrieve(link,'網易雲音樂\\' + name)
			print(name + ' 下載完成')
print('Download Completed!!!')


#歌詞:http://music.163.com/api/song/media?id=429450375
#單曲Json包:http://music.163.com/api/song/enhance/download/url?br=320000&id=429450375
#歌曲播放器: https://music.163.com/api/song/enhance/player/url 
# https://music.163.com/api/song/enhance/download/url?br=320000&id=28445467  --歌曲下載 id為歌曲id,br為播放位元速率
# 介面資料用的id=123456&ids=[123456]&br=3200000  --經測試可用,請各位合理使用,免得又被封禁

環境準備說明:Python3、Requests庫、request庫  (庫都是在Python.org官網的Pypi選單裡下的)、BeautifulSoup庫。Sublime程式碼編輯器、Chrome瀏覽器、一定硬碟空間。

美中不足的是此此操作沒有用美麗湯完成。

需要注意的是:在程式碼路徑需要建立名為“網易雲音樂”的目錄

關於庫的一些小技巧:新建個檔案以py結尾:

裡面輸入匯入庫的code:然後按Ctrl+B執行

如果沒有以下提示是正常的

正確的結果:

好的,就寫到這。