python Selenium實(shí)現(xiàn)付費(fèi)音樂(lè)批量下載的實(shí)現(xiàn)方法
必備環(huán)境
廢話
每年回家都要幫我爸下些音樂(lè),這對(duì)我來(lái)說(shuō)都是輕車熟路!可當(dāng)我打開網(wǎng)易云點(diǎn)擊下載按鈕的時(shí)候,可惜已物是人非啦!

開個(gè) VIP 其實(shí)也不貴,臨時(shí)用用也就¥15!但 IT 男的尊嚴(yán)必須要有,于是開始徜徉于搜索引擎中

最后在知乎中,搜索到一個(gè)網(wǎng)址VIP付費(fèi)音樂(lè)解析

P.S.再次感謝提供該服務(wù)的作者!如果你下載的音樂(lè)數(shù)量不多,直接這里搜索下載,下載后修改文件名即可!并且在這個(gè)網(wǎng)址中點(diǎn)擊播放列表-點(diǎn)擊同步,可以同步網(wǎng)易云的歌單!之后批量下載即是下載這些網(wǎng)易云的歌單!但是下載某個(gè)歌單中的幾百首歌,手動(dòng)下載就不現(xiàn)實(shí)了!在點(diǎn)擊同步中需要輸入你的網(wǎng)易云 UID,這 UID 的獲取方式如下:第一步打開網(wǎng)易云隨便選中一首歌,右鍵復(fù)制鏈接

然后隨便找個(gè)地方粘貼這個(gè)鏈接,例如https://music.163.com/song?id=25727803&userid=275613591最后這串?dāng)?shù)字就是 UID!
程序運(yùn)行環(huán)境
第一步安裝一個(gè)python3,這個(gè)簡(jiǎn)單吧!貼上我的版本 python3.65,安裝時(shí)注意勾選Add in path
第二步下載FFmpeg,這是用來(lái)解析視頻和音頻的,作為you-get的輔助工具,下載點(diǎn)這里,下載后解壓添加環(huán)境變量即可
第三步安裝you-get,這是個(gè)下載視頻音頻的神器,有興趣可以深入研究!之后我打算寫個(gè)下載任意視頻的工具,嘿嘿這是后話了!安裝方式很簡(jiǎn)單pip install you-get
環(huán)境配置就這樣,還是非常輕松的,下面會(huì)解釋下代碼
源碼
完整代碼
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time, os
# import threding
def get_music_name_link():
main_handle = browser.current_window_handle
fp = open('E:\\Project_PY\\file\\musiclink.txt','wb')
fp2 = open('E:\\Project_PY\\file\\musicname.txt','wb')
try:
for i in list(range(2,400)):
browser.switch_to_window(main_handle)
txt = browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div[1]/div/div[%d]' % i).text + '\n'
fp2.write(bytes(txt,encoding='utf-8'))
location = browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div[1]/div/div[%d]' % i)
ActionChains(browser).move_to_element(location).perform()
browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div[1]/div/div[%d]/span[5]/div/span[2]' % i).click()
time.sleep(2)
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1]) # lastest
url_link = browser.current_url + '\n'
fp.write(bytes(url_link,encoding='utf-8'))
browser.close()
except Exception as e:
print('get_music_name_link meet some problem! {}'.format(e))
fp.close()
fp2.close()
def download_music(list_name):
with open('E:\\Project_PY\\file\\musicname.txt','r',encoding='utf-8') as fp1:
music_name = fp1.readlines()
len1 = len(music_name)
fp2 = open('E:\\Project_PY\\file\\musicname_format.txt','w',encoding='utf-8')
for i in range(3,len1,4):
music_name_format = music_name[i].strip() + '\n'
fp2.write(music_name_format)
fp2.close()
with open('E:\\Project_PY\\file\\musiclink.txt','r',encoding='utf-8') as fp1:
with open('E:\\Project_PY\\file\\musicname_format.txt','r',encoding='utf-8') as fp2:
for music_link,music_name in zip(fp1.readlines(),fp2.readlines()):
you_get_link = 'you-get "{}" -o "E:\\Project_PY\\file\\music\\{}" -O "{}"'.format(music_link.strip(),list_name,music_name.strip())
you_get_link = you_get_link.strip()
# print(you_get_link)
os.system(you_get_link)
url = 'http://music.zhuolin.wang/'
uid = input('please input your uid:')
options = webdriver.FirefoxOptions()
options.add_argument('--headless')
browser = webdriver.Firefox(firefox_options=options)
browser.implicitly_wait(8)
browser.get(url)
# browser.maximize_window()
browser.set_window_size(1000,100000)
browser.find_element_by_xpath('/html/body/div[3]/div/div[1]/div/span[3]').click()
# scroll = browser.find_element_by_xpath('//*[@id="mCSB_1_dragger_vertical"]')
# ActionChains(browser).drag_and_drop_by_offset(scroll,0,100).perform()
# time.sleep(2)
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1]) # lastest
time.sleep(1)
browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[1]/div[1]/div/span/div[2]/span').click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1]) # lastest
time.sleep(1)
browser.find_element_by_xpath('/html/body/div[6]/div[2]/input').send_keys(uid)
browser.find_element_by_xpath('/html/body/div[6]/div[3]/a[1]').click()
# t1 = threading.Thread(target=get_music_name)
# t2 = threading.Thread(target=get_music_link)
# t3 = threading.Thread(target=download_music)
for i in list(range(3,100)):
try:
print('downloading song_list{}! please waiting....'.format(i))
browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[1]/div[1]/div/div[%d]/img' % i).click()
dir_name = browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[1]/div[1]/div/div[%d]/p' % i).text
time.sleep(1)
get_music_name_link()
download_music(dir_name)
browser.find_element_by_xpath('/html/body/div[3]/div/div[1]/div/span[3]').click()
time.sleep(1)
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1]) # lastest
time.sleep(5)
except Exception as e:
print('get_song_list meet some problem! {}'.format(e))
browser.quit()
核心代碼解釋
總共有三個(gè)函數(shù):
- 函數(shù)一
get_music_name_link,主要是獲取音樂(lè)名稱以及音樂(lè)的下載鏈接 - 函數(shù)二
download_music,獲取歌單名稱,然后拼接下載鏈接和音樂(lè)名,調(diào)用you-get開始下載到對(duì)應(yīng)目錄 - 函數(shù)三
main,主要是利用 UID 獲取歌單,以及批量下載歌單中的曲目
需要注意的幾個(gè)點(diǎn):
1.使用了sleep(1)休眠一秒,如果網(wǎng)絡(luò)較慢需要將所有的sleep休眠時(shí)間加長(zhǎng)
2.所有的路徑需要自己根據(jù)本機(jī)修改
3.如果要修改代碼一定要注意switch_to_window來(lái)切換窗口
4.73行的for i in list(range(3,100))是用來(lái)選擇下載的歌單,歌單從 1 開始計(jì)數(shù)

程序演示
輸入網(wǎng)易云的 UID!

然后靜靜的等待即可...此過(guò)程中會(huì)有部分音樂(lè)的播放聲音,不喜歡可以開靜音下

當(dāng)所有的鏈接解析完成后就會(huì)調(diào)用you-get下載,此過(guò)程會(huì)自動(dòng)創(chuàng)建與歌單名相同的文件夾

下載完成后



P.S.如果要下載所有歌單,就不需要修改代碼,直接輸入網(wǎng)易云的 UID 運(yùn)行即可!如果要下載某個(gè)具體的歌單只需要改動(dòng)73行的這個(gè)循環(huán)for i in list(range(3,100)),所以說(shuō)程序還是比較簡(jiǎn)單的,缺點(diǎn)可能就是沒(méi)時(shí)間寫 UI,而且也不太會(huì) pyqt 之類的,只會(huì)點(diǎn) MFC!所以將就用吧,功能還是很齊全的!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 基于python實(shí)現(xiàn)的百度音樂(lè)下載器python pyqt改進(jìn)版(附代碼)
- python實(shí)現(xiàn)音樂(lè)下載器
- python 根據(jù)列表批量下載網(wǎng)易云音樂(lè)的免費(fèi)音樂(lè)
- 基于Python實(shí)現(xiàn)下載網(wǎng)易音樂(lè)代碼實(shí)例
- python實(shí)現(xiàn)音樂(lè)播放和下載小程序功能
- python實(shí)現(xiàn)可下載音樂(lè)的音樂(lè)播放器
- 如何基于Python批量下載音樂(lè)
- python獲取酷狗音樂(lè)top500的下載地址 MP3格式
- Python爬取qq music中的音樂(lè)url及批量下載
- 用python制作個(gè)音樂(lè)下載器
相關(guān)文章
使用OpenCV circle函數(shù)圖像上畫圓的示例代碼
這篇文章主要介紹了使用OpenCV circle函數(shù)圖像上畫圓的示例代碼,本文內(nèi)容簡(jiǎn)短,給大家突出重點(diǎn)內(nèi)容,需要的朋友可以參考下2019-12-12
keras的load_model實(shí)現(xiàn)加載含有參數(shù)的自定義模型
這篇文章主要介紹了keras的load_model實(shí)現(xiàn)加載含有參數(shù)的自定義模型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
在jupyter notebook中調(diào)用.ipynb文件方式
這篇文章主要介紹了在jupyter notebook中調(diào)用.ipynb文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
python如何將aac轉(zhuǎn)為mp3,保持原有目錄結(jié)構(gòu)
使用Python腳本實(shí)現(xiàn)AAC格式轉(zhuǎn)MP3格式的方法介紹,需要用戶輸入AAC文件所在目錄路徑和MP3輸出目錄路徑,通過(guò)調(diào)用FFmpeg工具實(shí)現(xiàn)格式轉(zhuǎn)換,該腳本簡(jiǎn)單易懂,適合需要批量處理音頻文件的用戶,使用前需確保已安裝FFmpeg環(huán)境2024-11-11
對(duì)Python中GIL(全局解釋器鎖)的一點(diǎn)理解淺析
首先需要明確的一點(diǎn)是GIL并不是Python的特性,它是在實(shí)現(xiàn)Python解析器(CPython)時(shí)所引入的一個(gè)概念,下面這篇文章主要給大家介紹了關(guān)于對(duì)Python中GIL的一點(diǎn)理解,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
python wxpython 實(shí)現(xiàn)界面跳轉(zhuǎn)功能
wxpython沒(méi)提供界面跳轉(zhuǎn)的方式,所以就需要借助threading模塊,本文給大家分享python wxpython 實(shí)現(xiàn)界面跳轉(zhuǎn)功能,感興趣的朋友跟隨小編一起看看吧2019-12-12
Python dash-fastapi前后端搭建過(guò)程
項(xiàng)目中需要快速搭建一個(gè)前后端系統(tǒng),涉及到dash-fastapi架構(gòu)的時(shí)候,對(duì)該架構(gòu)的時(shí)候進(jìn)行總結(jié),本文主要總結(jié)的是對(duì)該架構(gòu)的基本使用,后續(xù)再對(duì)該架構(gòu)的項(xiàng)目源碼進(jìn)行總結(jié)分析,感興趣的朋友一起看看吧2025-03-03

