第五版(带有图形界面):
# -*- coding: utf-8 -*-
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt, Slot)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QLabel, QMainWindow, QMenuBar,
QPushButton, QRadioButton, QSizePolicy, QStatusBar,
QTextEdit, QWidget)
import sys
class Ui_NeteaseCloudMusic_Download(object):
def setupUi(self, NeteaseCloudMusic_Download):
if not NeteaseCloudMusic_Download.objectName():
NeteaseCloudMusic_Download.setObjectName(u"NeteaseCloudMusic_Download")
NeteaseCloudMusic_Download.resize(850, 674)
self.centralwidget = QWidget(NeteaseCloudMusic_Download)
self.centralwidget.setObjectName(u"centralwidget")
self.label = QLabel(self.centralwidget)
self.label.setObjectName(u"label")
self.label.setGeometry(QRect(20, 50, 31, 31))
self.label_2 = QLabel(self.centralwidget)
self.label_2.setObjectName(u"label_2")
self.label_2.setGeometry(QRect(20, 110, 51, 17))
self.label_3 = QLabel(self.centralwidget)
self.label_3.setObjectName(u"label_3")
self.label_3.setGeometry(QRect(20, 170, 67, 17))
self.textEdit = QTextEdit(self.centralwidget)
self.textEdit.setObjectName(u"textEdit")
self.textEdit.setGeometry(QRect(80, 50, 281, 31))
self.textEdit_2 = QTextEdit(self.centralwidget)
self.textEdit_2.setObjectName(u"textEdit_2")
self.textEdit_2.setGeometry(QRect(80, 110, 281, 31))
self.textEdit_3 = QTextEdit(self.centralwidget)
self.textEdit_3.setObjectName(u"textEdit_3")
self.textEdit_3.setGeometry(QRect(80, 170, 281, 31))
self.pushButton = QPushButton(self.centralwidget)
self.pushButton.setObjectName(u"pushButton")
self.pushButton.setGeometry(QRect(410, 60, 171, 51))
self.pushButton.clicked.connect(slotone)
self.pushButton_2 = QPushButton(self.centralwidget)
self.pushButton_2.setObjectName(u"pushButton_2")
self.pushButton_2.setGeometry(QRect(410, 120, 171, 31))
self.pushButton_2.clicked.connect(slotfour)
self.pushButton_3 = QPushButton(self.centralwidget)
self.pushButton_3.setObjectName(u"pushButton_3")
self.pushButton_3.setGeometry(QRect(410, 160, 171, 31))
self.pushButton_3.clicked.connect(slotfive)
self.textEdit_4 = QTextEdit(self.centralwidget)
self.textEdit_4.setObjectName(u"textEdit_4")
self.textEdit_4.setGeometry(QRect(10, 230, 831, 381))
self.radioButton = QRadioButton(self.centralwidget)
self.radioButton.setObjectName(u"radioButton")
self.radioButton.setGeometry(QRect(670, 90, 112, 23))
self.radioButton.clicked.connect(slottwo)
self.radioButton_2 = QRadioButton(self.centralwidget)
self.radioButton_2.setObjectName(u"radioButton_2")
self.radioButton_2.setGeometry(QRect(670, 140, 112, 23))
self.radioButton_2.clicked.connect(slotthree)
self.label_4 = QLabel(self.centralwidget)
self.label_4.setObjectName(u"label_4")
self.label_4.setGeometry(QRect(160, 10, 521, 31))
self.label_4.setAlignment(Qt.AlignCenter)
NeteaseCloudMusic_Download.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(NeteaseCloudMusic_Download)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 850, 27))
NeteaseCloudMusic_Download.setMenuBar(self.menubar)
self.statusbar = QStatusBar(NeteaseCloudMusic_Download)
self.statusbar.setObjectName(u"statusbar")
NeteaseCloudMusic_Download.setStatusBar(self.statusbar)
self.retranslateUi(NeteaseCloudMusic_Download)
QMetaObject.connectSlotsByName(NeteaseCloudMusic_Download)
# setupUi
def retranslateUi(self, NeteaseCloudMusic_Download):
NeteaseCloudMusic_Download.setWindowTitle(QCoreApplication.translate("NeteaseCloudMusic_Download", u"NeteaseCloudMusic_Download", None))
self.label.setText(QCoreApplication.translate("NeteaseCloudMusic_Download", u"ID:", None))
self.label_2.setText(QCoreApplication.translate("NeteaseCloudMusic_Download", u"Name:", None))
self.label_3.setText(QCoreApplication.translate("NeteaseCloudMusic_Download", u"Number:", None))
self.pushButton.setText(QCoreApplication.translate("NeteaseCloudMusic_Download", u"\u5f00\u59cb\u4e0b\u8f7d", None))
self.pushButton_2.setText(QCoreApplication.translate("NeteaseCloudMusic_Download", u"\u6e05\u7a7a\u4e0b\u8f7d\u5185\u5bb9", None))
self.pushButton_3.setText(QCoreApplication.translate("NeteaseCloudMusic_Download", u"\u6e05\u7a7a\u6267\u884c\u5185\u5bb9", None))
self.radioButton.setText(QCoreApplication.translate("NeteaseCloudMusic_Download", u"\u6279\u91cf\u4e0b\u8f7d", None))
self.radioButton_2.setText(QCoreApplication.translate("NeteaseCloudMusic_Download", u"\u5355\u66f2\u4e0b\u8f7d", None))
self.label_4.setText(QCoreApplication.translate("NeteaseCloudMusic_Download", u"Qt & Python", None))
# retranslateUi
@Slot()
def slotone():
global xuanze
ui.pushButton.setEnabled(False)
ui.pushButton_2.setEnabled(False)
ui.pushButton_3.setEnabled(False)
ui.textEdit_4.setEnabled(False)
ui.pushButton.setText("已完成0%")
strone = ui.textEdit.toPlainText()
strtwo = ui.textEdit_2.toPlainText()
strthree = ui.textEdit_3.toPlainText()
import requests
from bs4 import BeautifulSoup
header={
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',
'Referer': 'https://music.163.com/',
}
if xuanze == "1" :
#print("看到歌单所在网址的链接了吗,它的格式类似于“https://music.163.com/#/LIST?id=ID”")
LIST=strtwo
ID=strone
choicelimit=int(strthree)
link = "http://music.163.com/" + LIST + "?id=" + ID
r = requests.get(link, headers=header)
html = r.content
soup = BeautifulSoup(html, "html.parser")
songs = soup.find("ul", class_="f-hide").select("a", limit=choicelimit)
i = 1
for s in songs:
song_id = s['href'][9:]
song_name = s.text
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
ui.textEdit_4.insertPlainText("第 " + str(i) + " 首歌曲:" + song_down_link + "\n")
print("第 " + str(i) + " 首歌曲:" + song_down_link)
ui.textEdit_4.insertPlainText("正在下载...\n")
print("正在下载...")
QApplication.processEvents()
response = requests.get(song_down_link, headers=header).content
f = open(song_name + ".mp3", 'wb')
f.write(response)
f.close()
ui.textEdit_4.insertPlainText("下载完成.\n")
ui.pushButton.setText("已完成{:.2f}%".format(i*100/choicelimit))
print("下载完成.\n")
QApplication.processEvents()
i = i + 1
elif xuanze == "2" :
song_name=strtwo
song_id=strone
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
ui.textEdit_4.insertPlainText("正在下载...\n")
print("正在下载...")
QApplication.processEvents()
response = requests.get(song_down_link, headers=header).content
f = open(song_name + ".mp3", 'wb')
f.write(response)
f.close()
ui.textEdit_4.insertPlainText("下载完成.\n")
print("下载完成.\n")
QApplication.processEvents()
else:
ui.textEdit_4.setText("ERROR!")
ui.pushButton.setEnabled(True)
ui.pushButton_2.setEnabled(True)
ui.pushButton_3.setEnabled(True)
ui.textEdit_4.setEnabled(True)
ui.pushButton.setText("开始下载")
return
ui.pushButton.setEnabled(True)
ui.pushButton_2.setEnabled(True)
ui.pushButton_3.setEnabled(True)
ui.textEdit_4.setEnabled(True)
ui.pushButton.setText("开始下载")
@Slot()
def slottwo():
global xuanze
xuanze = "1"
@Slot()
def slotthree():
global xuanze
xuanze = "2"
ui.textEdit_3.setText("1")
@Slot()
def slotfour():
ui.textEdit.setText("")
ui.textEdit_2.setText("")
ui.textEdit_3.setText("")
@Slot()
def slotfive():
ui.textEdit_4.setText("")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QMainWindow()
ui = Ui_NeteaseCloudMusic_Download()
ui.setupUi(window)
xuanze = "-1"
window.show()
sys.exit(app.exec())
第四版:
import requests
from bs4 import BeautifulSoup
header={
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',
'Referer': 'https://music.163.com/',
}
xuanze=input("您选择哪种下载模式?\n1. 网易云音乐批量下载\n2. 网易云音乐单曲下载\n请输入:")
if xuanze == "1" :
print("看到歌单所在网址的链接了吗,它的格式类似于“https://music.163.com/#/LIST?id=ID”")
LIST=input("现在,请输入它的LIST部分:")
ID=input("现在,请输入它的ID部分:")
choicelimit=int(input('您想要下载多少首歌曲?(歌单从上往下数)\n请输入:'))
link = "http://music.163.com/" + LIST + "?id=" + ID
r = requests.get(link, headers=header)
html = r.content
soup = BeautifulSoup(html, "html.parser")
songs = soup.find("ul", class_="f-hide").select("a", limit=choicelimit)
i = 1
for s in songs:
song_id = s['href'][9:]
song_name = s.text
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
print("第 " + str(i) + " 首歌曲:" + song_down_link)
print("正在下载...")
response = requests.get(song_down_link, headers=header).content
f = open(song_name + ".mp3", 'wb')
f.write(response)
f.close()
print("下载完成.\n\r")
i = i + 1
elif xuanze == "2" :
song_name=input("请输入歌曲名称:")
song_id=input("请输入歌曲ID:")
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
print("正在下载...")
response = requests.get(song_down_link, headers=header).content
f = open(song_name + ".mp3", 'wb')
f.write(response)
f.close()
print("下载完成.\n\r")
第三版:
# 网易云音乐批量下载
print("看到歌单所在网址的链接了吗,它的格式类似于“https://music.163.com/#/LIST?id=ID”")
LIST=input("现在,请输入它的LIST部分:")
ID=input("现在,请输入它的ID部分:")
choicelimit=int(input('您想要下载多少首歌曲?(歌单从上往下数)\n请输入:'))
import requests
from bs4 import BeautifulSoup
header={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
'Referer':'http://93.174.95.27',
}
link = "http://music.163.com/" + LIST + "?id=" + ID
r = requests.get(link, headers=header)
html = r.content
soup = BeautifulSoup(html, "html.parser")
songs = soup.find("ul", class_="f-hide").select("a", limit=choicelimit)
i = 1
for s in songs:
song_id = s['href'][9:]
song_name = s.text
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
print("第 " + str(i) + " 首歌曲:" + song_down_link)
print("正在下载...")
response = requests.get(song_down_link, headers=header).content
f = open(song_name + ".mp3", 'wb')
f.write(response)
f.close()
print("下载完成.\n\r")
i = i + 1
第二版:
print('请注意,部分歌曲可能由于版权、会员等原因无法下载完整的音乐文件(通常表现为文件体积甚小,无法正常播放),若下载到这类音乐文件请手动删除。')
print('您要下载哪一个榜单上的音乐?(输入数字)\n1.云音乐飙升榜\n2.云音乐新歌榜\n3.云音乐原创榜\n4.云音乐热歌榜\n5.云音乐说唱榜\n6.云音乐古典榜\n7.云音乐电音榜\n8.云音乐ACG榜\n9.云音乐韩语榜\n10.云音乐国电榜\n11.UK排行榜周榜\n12.美国Billboard榜\n13.Beatport全球电子舞曲榜\n14.KTV唛榜\n15.日本Oricon榜\n16.云音乐欧美热歌榜\n17.云音乐欧美新歌榜\n18.法国 NRJ Vos Hits 周榜\n19.云音乐ACG动画榜\n20.云音乐ACG游戏榜\n21.云音乐ACG VOCALOID榜\n22.中国新乡村音乐排行榜\n23.云音乐日语榜\n24.云音乐摇滚榜\n25.云音乐古风榜\n26.潜力爆款榜\n27.云音乐民谣榜\n28.听歌识曲榜\n29.网络热歌榜\n30.俄语榜\n31.越南语榜\n32.中文DJ榜')
choice=input('您的选择是:')
biaosheng = "19723756"
xinge = "3779629"
yuanchuang = "2884035"
rege = "3778678"
shuochang = "991319590"
gudian = "71384707"
dianyin = "1978921795"
ACG = "71385702"
hanyu = "745956260"
guodian = "10520166"
UK = "180106"
Billboard = "60198"
Beatport = "3812895"
KTV = "21845217"
Oricon = "60131"
omeirege = "2809513713"
omeixinge = "2809577409"
NRJVosHits = "27135204"
ACGdonghua = "3001835560"
ACGyouxi = "3001795926"
ACGVOCALOID = "3001890046"
zhongguoxinxiangcun = "3112516681"
riyu = "5059644681"
yaogun = "5059633707"
gufeng = "5059642708"
qianlibaokuan = "5338990334"
minyao = "5059661515"
tinggeshiqv = "6688069460"
wangluorege = "6723173524"
eyu = "6732051320"
yuenanyu = "6732014811"
zhongwenDJ = "6886768100"
if choice == "1" :
choiceX = biaosheng
elif choice == "2" :
choiceX = xinge
elif choice == "3" :
choiceX = yuanchuang
elif choice == "4" :
choiceX = rege
elif choice == "5" :
choiceX = shuochang
elif choice == "6" :
choiceX = gudian
elif choice == "7" :
choiceX = dianyin
elif choice == "8" :
choiceX = ACG
elif choice == "9" :
choiceX = hanyu
elif choice == "10" :
choiceX = guodian
elif choice == "11" :
choiceX = UK
elif choice == "12" :
choiceX = Billboard
elif choice == "13" :
choiceX = Beatport
elif choice == "14" :
choiceX = KTV
elif choice == "15" :
choiceX = Oricon
elif choice == "16" :
choiceX = omeirege
elif choice == "17" :
choiceX = omeixinge
elif choice == "18" :
choiceX = NRJVosHits
elif choice == "19" :
choiceX = ACGdonghua
elif choice == "20" :
choiceX = ACGyouxi
elif choice == "21" :
choiceX = ACGVOCALOID
elif choice == "22" :
choiceX = zhongguoxinxiangcun
elif choice == "23" :
choiceX = riyu
elif choice == "24" :
choiceX = yaogun
elif choice == "25" :
choiceX = gufeng
elif choice == "26" :
choiceX = qianlibaokuan
elif choice == "27" :
choiceX = minyao
elif choice == "28" :
choiceX = tinggeshiqv
elif choice == "29" :
choiceX = wangluorege
elif choice == "30" :
choiceX = eyu
elif choice == "31" :
choiceX = yuenanyu
elif choice == "32" :
choiceX = zhongwenDJ
else :
print('您的输入有误,该程序将会报错退出!')
choicelimit=int(input('您想要下载多少首歌曲?(榜单从上往下数)\n请输入:'))
import requests
from bs4 import BeautifulSoup
header={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
'Referer':'http://93.174.95.27',
}
link = "http://music.163.com/discover/toplist?id=" + choiceX
r = requests.get(link, headers=header)
html = r.content
soup = BeautifulSoup(html, "html.parser")
songs = soup.find("ul", class_="f-hide").select("a", limit=choicelimit)
i = 1
for s in songs:
song_id = s['href'][9:]
song_name = s.text
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
print("第 " + str(i) + " 首歌曲:" + song_down_link)
print("正在下载...")
response = requests.get(song_down_link, headers=header).content
f = open(song_name + ".mp3", 'wb')
f.write(response)
f.close()
print("下载完成.\n\r")
i = i + 1
第一版:
print('您要下载哪一个榜单上的音乐?(输入数字)\n1.网易云飙升榜\n2.网易云新歌榜\n3.网易云原创榜\n4.网易云热歌榜')
choice=input('您的选择是:')
biaosheng = "19723756"
xinge = "3779629"
yuanchuang = "2884035"
rege = "3778678"
if choice == "1" :
choiceX = biaosheng
elif choice == "2" :
choiceX = xinge
elif choice == "3" :
choiceX = yuanchuang
elif choice == "4" :
choiceX = rege
else :
print('您的输入有误,该程序将会报错退出!')
choicelimit=int(input('您想要下载多少首歌曲?(榜单从上往下数)\n请输入:'))
import requests
from bs4 import BeautifulSoup
header={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
'Referer':'http://93.174.95.27',
}
link = "http://music.163.com/discover/toplist?id=" + choiceX
r = requests.get(link, headers=header)
html = r.content
soup = BeautifulSoup(html, "html.parser")
songs = soup.find("ul", class_="f-hide").select("a", limit=choicelimit)
i = 1
for s in songs:
song_id = s['href'][9:]
song_name = s.text
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
print("第 " + str(i) + " 首歌曲:" + song_down_link)
print("正在下载...")
response = requests.get(song_down_link, headers=header).content
f = open(song_name + ".mp3", 'wb')
f.write(response)
f.close()
print("下载完成.\n\r")
i = i + 1
某位大佬的超级版:
import sys
import os
import os.path
try:
import requests
except:
print("Please use 'pip install requests' or 'pip3 install requests'")
sys.exit(1)
try:
from bs4 import BeautifulSoup
except:
print("Please use 'pip install bs4' or 'pip3 install bs4'")
sys.exit(1)
useMultiThread = True
try:
import threading
try:
import threadpool
except:
print("Please use 'pip install threadpool' or 'pip3 install threadpool'")
except:
print("You not install threading module, do not use multi thread download")
useMultiThread = False
header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
'Referer': 'http://93.174.95.27',
}
targets = {
'热歌榜': 'http://music.163.com/discover/toplist?id=3778678',
'云音乐电音榜': 'https://music.163.com/discover/toplist?id=1978921795',
'云音乐ACG榜': 'https://music.163.com/discover/toplist?id=71385702',
'云音乐ACG动画榜': 'https://music.163.com/discover/toplist?id=3001835560',
}
_max = 0
_min = 0
progress = "#############################"
whitechr = "............................."
def download(index, song, dir):
song_id = song['href'][9:]
song_name = song.text
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
global _min
global _max
if os.path.exists("mp3/{}/".format(dir) + song_name.replace("/","_") + ".mp3"):
_min = _min + 1
return
if not useMultiThread:
print("第 " + str(index+1) + " 首歌曲:" + song_down_link)
response = requests.get(song_down_link, headers=header).content
f = open("mp3/{}/".format(dir) + song_name.replace("/","_") + ".mp3", 'wb')
f.write(response)
f.close()
if os.path.getsize("mp3/{}/".format(dir) + song_name.replace("/","_") + ".mp3") < 200 * 1024:
os.remove("mp3/{}/".format(dir) + song_name.replace("/","_") + ".mp3")
_min = _min + 1
cur = _min * (100 / _max)
lt = len(progress) * (cur/100)
gt = len(progress) - lt
print("[{}{}] {}% - {}/{}".format(progress[:int(lt)],whitechr[:int(gt)],int(cur),_min,_max), end="\r")
def GetMusicList(key, target) -> list:
response = requests.get(target, headers=header)
html = response.content
soup = BeautifulSoup(html, "html.parser")
songs = soup.find("ul", class_="f-hide").select("a")
args_list = []
for i in range(len(songs)):
args_list.append((None, {'index': i, 'song': songs[i], 'dir': key}))
return args_list
if __name__ == "__main__":
if not os.path.exists("mp3"):
os.mkdir("mp3")
musicList = []
for (key, target) in targets.items():
if not os.path.exists("mp3/{}".format(key)):
os.mkdir("mp3/{}".format(key))
print(key, target)
musicList.extend(GetMusicList(key, target))
_max = len(musicList)
if useMultiThread:
pool = threadpool.ThreadPool(5)
reqs = threadpool.makeRequests(download, musicList)
[pool.putRequest(req) for req in reqs]
pool.wait()
sys.exit(0)
for i in range(len(musicList)):
download(i, musicList[i], musicList[i][1]['dir'])