非常抱歉给你带来困扰。这个错误是由于 `mp3_url` 变量未正确获取音乐文件的URL导致的。在你提供的网址 ...
报错:
Traceback (most recent call last):
File "D:\Python\pythonProject\Music.py", line 48, in download_music
with open(save_path, 'wb') as f:
^^^^^^^^^^^^^^^^^^^^^
TypeError: expected str, bytes or os.PathLike object, not tuple 凊风 发表于 2024-05-01 07:08
报错:
Traceback (most recent call last):
File ...
非常抱歉,我之前的代码中出现了错误。这个错误是由于 `save_path` 变量的格式不正确导致的。
下面是修复后的代码示例:
import os
import requests
from PySide6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QLineEdit, QFileDialog
class MusicDownloader(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("音乐下载")
self.layout = QVBoxLayout()
self.url_label = QLabel("请输入歌曲网址:")
self.layout.addWidget(self.url_label)
self.url_input = QLineEdit()
self.layout.addWidget(self.url_input)
self.path_label = QLabel("请选择存储路径:")
self.layout.addWidget(self.path_label)
self.path_input = QLineEdit()
self.layout.addWidget(self.path_input)
self.choose_button = QPushButton("选择路径")
self.choose_button.clicked.connect(self.choose_path)
self.layout.addWidget(self.choose_button)
self.download_button = QPushButton("下载")
self.download_button.clicked.connect(self.download_music)
self.layout.addWidget(self.download_button)
self.setLayout(self.layout)
def choose_path(self):
file_dialog = QFileDialog(self)
file_dialog.setFileMode(QFileDialog.Directory)
save_path = file_dialog.getExistingDirectory()
self.path_input.setText(save_path)
def download_music(self):
music_url = self.url_input.text()
save_path = self.path_input.text()
if not music_url or not save_path:
return
mp3_response = requests.get(music_url)
mp3_content = mp3_response.content
file_name = music_url.split('/')[-1] + '.mp3'
file_path = os.path.join(save_path, file_name)
with open(file_path, 'wb') as f:
f.write(mp3_content)
print("音乐下载完成!")
app = QApplication([])
window = MusicDownloader()
window.show()
app.exec()
这个代码示例创建了一个简单的 PySide6 界面,让用户输入歌曲网址和选择存储路径,然后点击下载按钮进行音乐下载。确保安装了 PySide6 库,并运行代码即可。当音乐下载完成后,会在控制台打印提示信息。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-1 07:09
非常抱歉,我之前的代码中出现了错误。这个错误是由于 `save_path` 变量的格式不正确导致的。
下面 ...
我录入:https://music.163.com/#/song?id=2080607
然后报错:
Traceback (most recent call last):
File "D:\Python\pythonProject\Music.py", line 52, in download_music
with open(file_path, 'wb') as f:
^^^^^^^^^^^^^^^^^^^^^
OSError: Invalid argument: 'E:/Temp\\song?id=2080607.mp3' 凊风 发表于 2024-05-01 07:11
我录入:https://music.163.com/#/song?id=2080607
...
非常抱歉再次给您带来困扰。这个错误是由于文件路径格式不正确导致的。
下面是修复后的代码示例:
import os
import requests
from PySide6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QLineEdit, QMessageBox
class MusicDownloader(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("音乐下载器")
self.setup_ui()
def setup_ui(self):
layout = QVBoxLayout()
self.url_label = QLabel("歌曲链接:")
layout.addWidget(self.url_label)
self.url_edit = QLineEdit()
layout.addWidget(self.url_edit)
self.save_path_label = QLabel("保存路径:")
layout.addWidget(self.save_path_label)
self.save_path_edit = QLineEdit()
layout.addWidget(self.save_path_edit)
self.download_button = QPushButton("下载音乐")
self.download_button.clicked.connect(self.download_music)
layout.addWidget(self.download_button)
self.setLayout(layout)
def download_music(self):
url = self.url_edit.text()
save_path = self.save_path_edit.text()
if not url or not save_path:
QMessageBox.warning(self, "警告", "请填写完整的歌曲链接和保存路径")
return
try:
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
song_name = soup.find('meta', property='og:title')['content']
mp3_url = soup.find('meta', property='og:audio')['content']
file_path = os.path.join(save_path, f"{song_name}.mp3")
with open(file_path, 'wb') as f:
f.write(requests.get(mp3_url).content)
QMessageBox.information(self, "提示", f"音乐下载完成,保存路径:{file_path}")
except Exception as e:
QMessageBox.critical(self, "错误", str(e))
if __name__ == '__main__':
app = QApplication([])
window = MusicDownloader()
window.show()
app.exec()
在这个示例中,我们使用了 PySide6 创建了一个简单的界面,包含一个输入框和一个按钮。用户在输入框中输入歌曲链接,点击按钮后将会触发下载音乐的操作,并将音乐保存到指定的路径下。请将其中的 `E:/Temp` 改为你希望保存音乐的路径。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-1 07:09
非常抱歉,我之前的代码中出现了错误。这个错误是由于 `save_path` 变量的格式不正确导致的。
下面 ...
报错:
Traceback (most recent call last):
File "D:\Python\pythonProject\Music.py", line 52, in download_music
with open(file_path, 'wb') as f:
^^^^^^^^^^^^^^^^^^^^^
OSError: Invalid argument: 'E:/Temp\\song?id=2080607.mp3' 凊风 发表于 2024-05-01 07:16
报错:
Traceback (most recent call last):
File ...
非常抱歉给你带来困扰。这个错误是由于文件路径中包含了无效字符导致的。在Windows系统中,文件名不能包含如`?`等特殊字符。
以下是修正后的代码示例,确保文件名的有效性:
import os
import requests
from PySide6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
def download_music():
# 获取输入的网址
url = input_line.text()
# 发送请求获取页面内容
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 找到音乐标签并获取mp3链接
mp3_url = soup.select_one('audio').get('src')
# 提取歌曲名称作为保存文件名
song_name = url.split('=')[-1]
file_name = f"{song_name}.mp3"
# 指定保存路径
save_path = os.path.join("E:\Temp", file_name)
# 下载音乐
mp3_response = requests.get(mp3_url)
with open(save_path, 'wb') as f:
f.write(mp3_response.content)
# 创建界面
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
label = QLabel("请输入要下载的音乐网址:")
layout.addWidget(label)
input_line = QLineEdit()
layout.addWidget(input_line)
button = QPushButton("下载音乐")
button.clicked.connect(download_music)
layout.addWidget(button)
window.setLayout(layout)
window.show()
app.exec()
请注意,如果在运行过程中出现`PermissionError: Permission denied: 'E:/Temp/song?id=2080607.mp3'`错误,请确保目标保存路径`E:\Temp`是存在且可写的。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-1 07:16
非常抱歉给你带来困扰。这个错误是由于文件路径中包含了无效字符导致的。在Windows系统中,文件名不能 ...
import os
import requests
from bs4 import BeautifulSoup
from PySide6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QLineEdit, QFileDialog
def download_music():
# 获取输入的网址
url = input_line.text()
# 发送请求获取页面内容
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 找到音乐标签并获取mp3链接
mp3_url = soup.select_one('audio').get('src')
# 提取歌曲名称作为保存文件名
song_name = url.split('=')[-1]
file_name = f"{song_name}.mp3"
# 指定保存路径
save_path = os.path.join("E:\Temp", file_name)
# 下载音乐
mp3_response = requests.get(mp3_url)
with open(save_path, 'wb') as f:
f.write(mp3_response.content)
# 创建界面
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
label = QLabel("请输入要下载的音乐网址:")
layout.addWidget(label)
input_line = QLineEdit()
layout.addWidget(input_line)
button = QPushButton("下载音乐")
button.clicked.connect(download_music)
layout.addWidget(button)
window.setLayout(layout)
window.show()
app.exec()
报错:
Traceback (most recent call last):
File "D:\Python\pythonProject\Music.py", line 16, in download_music
mp3_url = soup.select_one('audio').get('src')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get' 凊风 发表于 2024-05-01 07:19
import os
import requests
from bs4 import Beauti ...
这个错误是因为页面中没有找到 `audio` 标签导致的。可能是因为你提供的网址并不是直接指向音乐的链接。
你可以尝试查看页面源代码,或者使用开发者工具来确定正确的音乐链接。一般来说,应该能在 `<audio>` 标签中找到音乐链接。
另外,你还可以尝试其他方式来获取音乐链接,比如通过分析网页中的 JavaScript 代码。请记住,在爬取数据时,请遵守相关网站的使用规定,并确保您拥有对音乐的合法使用权。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 凊风 发表于 2024-5-1 07:19
import os
import requests
from bs4 import BeautifulSoup
这个问题ai是无法帮你的,某云以前是可以爬的,但显然是有加密的,解析加密ai是不可能会的 凊风 发表于 2024-5-1 07:19
import os
import requests
from bs4 import BeautifulSoup
之前写过很多,但都失效了
看看五一假期能不能再写个 青出于蓝 发表于 2024-5-1 09:21
之前写过很多,但都失效了
看看五一假期能不能再写个
先谢谢了
恳请能够按“歌手”、“歌名”或者“歌词”来搜索Mp3或者Mtv,连对应的歌词也一并下载下来储存到指定的路径就好了。 青出于蓝 发表于 2024-5-1 09:21
之前写过很多,但都失效了
看看五一假期能不能再写个
刚刚我在网上找了一段,可以下载mp3,但歌词不知道为什么没能保存下来。
import os
import re
import json
import requests
from lxml import etree
def download_songs(url=None):
if url is None:
# url = 'https://music.163.com/#/playlist?id=2384642500'
url = 'https://music.163.com/#/artist?id=45839'
url = url.replace('/#', '').replace('https', 'http')# 对字符串进行去空格和转协议处理
# 网易云音乐外链url接口:http://music.163.com/song/media/outer/url?id=xxxx
out_link = 'http://music.163.com/song/media/outer/url?id='
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://music.163.com/',
'Host': 'music.163.com'
}
# 请求页面的源码
res = requests.get(url=url, headers=headers).text
tree = etree.HTML(res)
# 音乐列表
song_list = tree.xpath('//ul[@class="f-hide"]/li/a')
# 如果是歌手页面
artist_name_tree = tree.xpath('//h2[@id="artist-name"]/text()')
artist_name = str(artist_name_tree) if artist_name_tree else None
# 如果是歌单页面:
#song_list_tree = tree.xpath('//*[@id="m-playlist"]/div/div/div/div/div/div/div/table/tbody')
song_list_name_tree = tree.xpath('//h2/text()')
song_list_name = str(song_list_name_tree) if song_list_name_tree else None
# 设置音乐下载的文件夹为歌手名字或歌单名
folder = './' + artist_name if artist_name else './' + song_list_name
if not os.path.exists(folder):
os.mkdir(folder)
for i, s in enumerate(song_list):
href = str(s.xpath('./@href'))
song_id = href.split('=')[-1]
src = out_link + song_id# 拼接获取音乐真实的src资源值
title = str(s.xpath('./text()'))# 音乐的名字
filename = title + '.mp3'
filepath = folder + '/' + filename
print('开始下载第{}首音乐:{}\n'.format(i + 1, filename))
try:# 下载音乐
#下载歌词
download_lyric(title, song_id)
data = requests.get(src).content# 音乐的二进制数据
with open(filepath, 'wb') as f:
f.write(data)
except Exception as e:
print(e)
print('{}首全部歌曲已经下载完毕!'.format(len(song_list)))
def download_lyric(song_name, song_id):
url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id)
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://music.163.com/',
'Host': 'music.163.com'
# 'Origin': 'https://music.163.com'
}
# 请求页面的源码
res = requests.get(url=url, headers=headers).text
json_obj = json.loads(res)
lyric = json_obj['lrc']['lyric']
reg = re.compile(r'\[.*\]')
lrc_text = re.sub(reg, '', lyric).strip()
print(song_name, lrc_text)
if __name__ == '__main__':
# music_list = 'https://music.163.com/#/playlist?id=689440333' #歌曲清单
music_list = 'https://music.163.com/#/artist?id=45839' #歌手排行榜
# music_list = 'https://music.163.com/#/search/m/?order=hot&cat=全部&limit=435&offset=435&s=梁静茹' #搜索列表
download_songs(music_list)
并且这位老兄没写成Pyside6界面,感觉不太方便^_^ FishC 发表于 2024-5-1 07:16
非常抱歉给你带来困扰。这个错误是由于文件路径中包含了无效字符导致的。在Windows系统中,文件名不能 ...
刚刚我在网上找了一段,可以下载mp3,但歌词不知道为什么没能保存下来。
import os
import re
import json
import requests
from lxml import etree
def download_songs(url=None):
if url is None:
# url = 'https://music.163.com/#/playlist?id=2384642500'
url = 'https://music.163.com/#/artist?id=45839'
url = url.replace('/#', '').replace('https', 'http')# 对字符串进行去空格和转协议处理
# 网易云音乐外链url接口:http://music.163.com/song/media/outer/url?id=xxxx
out_link = 'http://music.163.com/song/media/outer/url?id='
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://music.163.com/',
'Host': 'music.163.com'
}
# 请求页面的源码
res = requests.get(url=url, headers=headers).text
tree = etree.HTML(res)
# 音乐列表
song_list = tree.xpath('//ul[@class="f-hide"]/li/a')
# 如果是歌手页面
artist_name_tree = tree.xpath('//h2[@id="artist-name"]/text()')
artist_name = str(artist_name_tree) if artist_name_tree else None
# 如果是歌单页面:
#song_list_tree = tree.xpath('//*[@id="m-playlist"]/div/div/div/div/div/div/div/table/tbody')
song_list_name_tree = tree.xpath('//h2/text()')
song_list_name = str(song_list_name_tree) if song_list_name_tree else None
# 设置音乐下载的文件夹为歌手名字或歌单名
folder = './' + artist_name if artist_name else './' + song_list_name
if not os.path.exists(folder):
os.mkdir(folder)
for i, s in enumerate(song_list):
href = str(s.xpath('./@href'))
song_id = href.split('=')[-1]
src = out_link + song_id# 拼接获取音乐真实的src资源值
title = str(s.xpath('./text()'))# 音乐的名字
filename = title + '.mp3'
filepath = folder + '/' + filename
print('开始下载第{}首音乐:{}\n'.format(i + 1, filename))
try:# 下载音乐
#下载歌词
download_lyric(title, song_id)
data = requests.get(src).content# 音乐的二进制数据
with open(filepath, 'wb') as f:
f.write(data)
except Exception as e:
print(e)
print('{}首全部歌曲已经下载完毕!'.format(len(song_list)))
def download_lyric(song_name, song_id):
url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id)
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://music.163.com/',
'Host': 'music.163.com'
# 'Origin': 'https://music.163.com'
}
# 请求页面的源码
res = requests.get(url=url, headers=headers).text
json_obj = json.loads(res)
lyric = json_obj['lrc']['lyric']
reg = re.compile(r'
.∗
')
lrc_text = re.sub(reg, '', lyric).strip()
print(song_name, lrc_text)
if __name__ == '__main__':
# music_list = 'https://music.163.com/#/playlist?id=689440333' #歌曲清单
music_list = 'https://music.163.com/#/artist?id=45839' #歌手排行榜
# music_list = 'https://music.163.com/#/search/m/?order=hot&cat=全部&limit=435&offset=435&s=梁静茹' #搜索列表
download_songs(music_list)
并且这位老兄没写成Pyside6界面,感觉不太方便^_^ 凊风 发表于 2024-05-01 15:45
刚刚我在网上找了一段,可以下载mp3,但歌词不知道为什 ...
感谢提供代码示例。这段代码主要是爬取网易云音乐上的歌曲,并且同时下载歌曲和歌词。
但是需要注意,该代码中的URL链接是错误的,不能直接访问到具体的歌曲列表或歌手页面。你可以根据具体的需求,修改`music_list`变量的值为你想要下载的歌单、歌手排行榜或搜索列表的URL。
另外,你也可以在代码中添加一些判断逻辑,以便在页面请求或解析失败时给出相应的提示信息。
至于Pyside6界面的编写,确实这段代码并没有使用到图形界面库。如果你希望将爬虫与界面结合起来,可以使用Pyside6创建一个GUI界面,然后调用适当的函数来触发爬取操作。你可以参考之前我给出的示例,根据自己的需求进行修改和扩展。
希望对你有所帮助!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-1 15:45
感谢提供代码示例。这段代码主要是爬取网易云音乐上的歌曲,并且同时下载歌曲和歌词。
但是需要注意 ...
请问 print(song_name, lrc_text)能够打印出来的歌词如何储存在与song_name对应的Txt中? 凊风 发表于 2024-05-01 17:44
请问 print(song_name, lrc_text)能够打印出来的歌词 ...
要将歌词保存到与歌曲名称对应的文本文件中,可以在 `download_lyric` 函数中添加保存歌词的代码。以下是修改后的 `download_lyric` 函数示例:
def download_lyric(song_name, song_id):
url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id)
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://music.163.com/',
'Host': 'music.163.com'
}
res = requests.get(url=url, headers=headers).text
json_obj = json.loads(res)
lyric = json_obj.get('lrc', {}).get('lyric')# 获取歌词文本
reg = re.compile(r'\[.*?\]')
lrc_text = re.sub(reg, '', lyric).strip()
print(song_name, lrc_text)
# 将歌词保存到文本文件中
file_path = './lyrics/{}.txt'.format(song_name)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(lrc_text)
在这个示例中,我将歌词保存到了一个名为 `lyrics` 的文件夹中,并根据歌曲名称创建了相应的文本文件。您也可以根据需要修改保存路径。请确保在运行代码之前,已经创建好了该文件夹。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-1 17:44
要将歌词保存到与歌曲名称对应的文本文件中,可以在 `download_lyric` 函数中添加保存歌词的代码。以下 ...
没有找到lyrics文件夹。。。。
请问能不能指定到E:\Temp\lyrics中? 凊风 发表于 2024-05-01 17:52
没有找到lyrics文件夹。。。。
请问能不能指定到E: ...
当然可以!以下是修改后的代码示例,可以将歌词保存到 `E:\Temp\lyrics` 文件夹中:
import os
import re
import json
import requests
from lxml import etree
LYRICS_FOLDER = 'E:/Temp/lyrics'
def download_songs(url=None):
if url is None:
url = 'https://music.163.com/#/artist?id=45839'
# 其他代码省略...
def download_lyric(song_name, song_id):
url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id)
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://music.163.com/',
'Host': 'music.163.com'
}
res = requests.get(url=url, headers=headers).text
json_obj = json.loads(res)
if 'lrc' in json_obj and 'lyric' in json_obj['lrc']:
lyric = json_obj['lrc']['lyric']
reg = re.compile(r'\[.*\]')
lrc_text = re.sub(reg, '', lyric).strip()
filename = '{}.txt'.format(song_name)
filepath = os.path.join(LYRICS_FOLDER, filename)
with open(filepath, 'w', encoding='utf-8') as f:
f.write(lrc_text)
print('歌曲名:{},歌词已保存到文件:{}'.format(song_name, filename))
if __name__ == '__main__':
if not os.path.exists(LYRICS_FOLDER):
os.makedirs(LYRICS_FOLDER)
download_songs()
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
1
[2]