pyzyd 发表于 2025-7-2 20:09:35

PyQt5+requests实现音乐下载

本帖最后由 pyzyd 于 2025-7-2 20:28 编辑

浅浅的学了一点爬虫和pyqt5,
做出来一个小作品,分享一下
代码不难,难的是找网站,找了我半天{:10_247:}
会一点基础,不会破解(就算会破解了也不敢发出来{:10_260:})





双击每行文字就能下载!!!

源码打包:




附件只能上传2MB文件,做出来的exe文件
压缩包弄不了这么小,就通过网盘分享了{:10_262:}

链接:打包好的应用





FishC 发表于 2025-7-2 20:11:46

下面是一个使用PyQt5和requests实现的简易音乐下载器示例代码。该程序通过搜索API获取音乐列表,双击列表项即可下载音乐文件:


import sys
import os
import requests
from PyQt5.QtWidgets import (QApplication, QWidget, QLineEdit,
                           QListWidget, QVBoxLayout, QMessageBox)

class MusicDownloader(QWidget):
    def __init__(self):
      super().__init__()
      self.initUI()
      
    def initUI(self):
      self.setWindowTitle('简易音乐下载器')
      self.setGeometry(300, 300, 500, 400)
      
      # 创建搜索框
      self.search_input = QLineEdit(self)
      self.search_input.setPlaceholderText("输入歌曲名按回车搜索...")
      self.search_input.returnPressed.connect(self.search_music)
      
      # 创建结果列表
      self.result_list = QListWidget(self)
      self.result_list.itemDoubleClicked.connect(self.download_music)
      
      # 布局
      layout = QVBoxLayout()
      layout.addWidget(self.search_input)
      layout.addWidget(self.result_list)
      self.setLayout(layout)
   
    def search_music(self):
      """搜索音乐并显示结果"""
      keyword = self.search_input.text().strip()
      if not keyword:
            return
            
      self.result_list.clear()
      
      try:
            # 实际项目中替换为真实的搜索API
            # 这里使用模拟数据演示
            mock_data = [
                {"name": f"{keyword} - 歌手A", "url": "http://example.com/song1.mp3"},
                {"name": f"{keyword} - 歌手B", "url": "http://example.com/song2.mp3"}
            ]
            
            for song in mock_data:
                self.result_list.addItem(song["name"])
                self.result_list.item(self.result_list.count()-1).setData(32, song["url"])
               
      except Exception as e:
            QMessageBox.warning(self, "错误", f"搜索失败: {str(e)}")
   
    def download_music(self, item):
      """下载选中的音乐"""
      try:
            url = item.data(32)# 获取存储的URL
            song_name = item.text().replace(" ", "_").replace("/", "") + ".mp3"
            
            # 创建下载目录
            os.makedirs("downloads", exist_ok=True)
            save_path = os.path.join("downloads", song_name)
            
            # 下载音乐文件
            response = requests.get(url, stream=True, timeout=30)
            with open(save_path, 'wb') as f:
                for chunk in response.iter_content(chunk_size=1024):
                  if chunk:
                        f.write(chunk)
            
            QMessageBox.information(self, "成功", f"已保存到: {save_path}")
            
      except Exception as e:
            QMessageBox.critical(self, "下载失败", f"错误信息: {str(e)}")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MusicDownloader()
    ex.show()
    sys.exit(app.exec_())


### 使用说明:
1. 在搜索框输入歌曲名,按回车进行搜索
2. 双击列表中的歌曲项开始下载
3. 下载的音乐文件会保存在程序所在目录的 downloads 文件夹

### 注意事项:
1. 需要安装依赖库:
   pip install PyQt5 requests
   
2. 实际使用时需要:
   - 替换代码中的模拟数据为真实音乐API
   - 处理可能的反爬机制(如Headers、Cookies)
   - 添加下载进度显示(可通过PyQt5的QProgressBar实现)

### 重要提示:
- 请确保遵守相关网站的使用条款
- 仅下载拥有合法授权的音乐内容
- 本示例仅用于技术学习目的

如果需要实现更完整的功能(如下载进度显示、多线程下载等),可以在基础代码上进行扩展。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 2025-7-2 20:52:39

这个好!

某一个“天” 发表于 2025-7-2 21:19:13

{:10_275:}

冲浪的口香糖 发表于 2025-7-2 21:41:22

666这可太刑了

爬虫121 发表于 2025-7-2 22:02:11

感谢

画风华 发表于 2025-7-3 08:20:30

哇!这可太棒了{:5_106:}

快速收敛 发表于 2025-7-3 09:58:49

厉害厉害

gpa5031 发表于 2025-7-3 17:30:06

好牛啊

Mr.江南 发表于 2025-7-3 18:16:27

{:5_106:}

sfqxx 发表于 2025-7-3 21:40:05

yueyueyue1023W 发表于 2025-7-4 08:46:05

不错不错

yu55800 发表于 2025-7-4 10:04:16

{:5_106:}

cjjJasonchen 发表于 2025-7-4 15:16:41

好久没看到技术贴了{:10_297:}

sfqxx_小 发表于 2025-7-4 21:55:16

好活,当赏!

Crayonl 发表于 2025-7-5 13:51:26

厉害了{:10_256:}

尉尉的可乐 发表于 2025-7-9 10:33:59

太厉害了

学数学的混子 发表于 2025-7-9 11:40:05

FishC 发表于 2025-7-2 20:11
下面是一个使用PyQt5和requests实现的简易音乐下载器示例代码。该程序通过搜索API获取音乐列表,双击列表项 ...

你就是我的哥{:5_108:}

FishC 发表于 2025-7-9 11:42:11

学数学的混子 发表于 2025-07-09 11:40
FishC 发表于 2025-7-2 20:11
下面是一个使用PyQt5和 ...

以下是修正后的音乐下载器代码实现,解决了原代码中的几个关键问题:


import sys
import os
import requests
from PyQt5.QtWidgets import (QApplication, QWidget, QLineEdit,
                           QListWidget, QVBoxLayout, QMessageBox)
from PyQt5.QtCore import Qt

class MusicDownloader(QWidget):
    def __init__(self):
      super().__init__()
      self.initUI()
      
    def initUI(self):
      self.setWindowTitle('简易音乐下载器')
      self.setGeometry(300, 300, 500, 400)
      
      self.search_input = QLineEdit(self)
      self.search_input.setPlaceholderText("输入歌曲名按回车搜索...")
      self.search_input.returnPressed.connect(self.search_music)
      
      self.result_list = QListWidget(self)
      self.result_list.itemDoubleClicked.connect(self.download_music)
      
      layout = QVBoxLayout()
      layout.addWidget(self.search_input)
      layout.addWidget(self.result_list)
      self.setLayout(layout)
   
    def search_music(self):
      keyword = self.search_input.text().strip()
      if not keyword:
            return
            
      self.result_list.clear()
      
      try:
            # 实际使用需替换为真实API
            mock_data = [
                {"name": f"{keyword} - 歌手A", "url": "https://example.com/song1.mp3"},
                {"name": f"{keyword} - 歌手B", "url": "https://example.com/song2.mp3"}
            ]
            
            for song in mock_data:
                # 修正:正确添加列表项并存储数据
                self.result_list.addItem(song["name"])
                item = self.result_list.item(self.result_list.count()-1)
                item.setData(Qt.UserRole, song["url"])# 存储下载URL
               
      except Exception as e:
            QMessageBox.warning(self, "错误", f"搜索失败: {str(e)}")
   
    def download_music(self, item):
      try:
            # 修正:正确获取存储的URL
            url = item.data(Qt.UserRole)
            if not url:
                raise ValueError("无效的下载链接")
               
            # 清理文件名中的特殊字符
            song_name = item.text().replace(" ", "_")
            invalid_chars = ['/', '\\', ':', '*', '?', '"', '<', '>', '|']
            for char in invalid_chars:
                song_name = song_name.replace(char, "")
            song_name += ".mp3"
            
            os.makedirs("downloads", exist_ok=True)
            save_path = os.path.join("downloads", song_name)
            
            # 添加超时设置和异常处理
            response = requests.get(url, stream=True, timeout=10)
            response.raise_for_status()
            
            with open(save_path, 'wb') as f:
                for chunk in response.iter_content(chunk_size=8192):
                  f.write(chunk)
            
            QMessageBox.information(self, "成功", f"已保存到: {save_path}")
            
      except Exception as e:
            QMessageBox.critical(self, "下载失败", f"错误信息: {str(e)}")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MusicDownloader()
    ex.show()
    sys.exit(app.exec_())


主要修复内容:
1. 数据存储修复:使用 Qt.UserRole 正确存储URL
2. 文件名处理:增加特殊字符过滤
3. 网络请求优化:添加超时设置和状态检查
4. 错误处理增强:完善异常捕获机制

使用说明:
1. 安装依赖:
   pip install PyQt5 requests
   
2. 运行程序:
   python music_downloader.py

3. 操作流程:
   - 输入歌曲名 → 按回车搜索
   - 双击列表项下载
   - 文件保存在 downloads 目录

注意事项:
1. 示例使用模拟数据,实际需要接入真实音乐API
2. 下载前确认目标网站的服务条款
3. 商业用途需获得版权授权
4. 可扩展功能:
   - 添加进度条
   - 支持多线程下载
   - 增加文件格式选择

建议:
1. 开发时使用虚拟环境
2. 真实API调用需添加请求头信息
3. 重要操作添加日志记录
4. 打包可使用 pyinstaller

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

1997xx 发表于 2025-7-9 13:42:30

666666666666666666666666666666666666
页: [1] 2 3
查看完整版本: PyQt5+requests实现音乐下载