Python PyQt多线程百度音乐下载器优化与路径问题解析

纸上星河
纸上星河
发布时间:2026-10-13| 6人浏览过
原创

本文介绍了一款基于Python和PyQt的百度音乐下载器的改进版。通过引入主线程加8个子线程的多线程架构,将百首歌曲扫描时间从40秒缩短至9秒左右,并解决了UI阻塞问题。同时,详细解析了os.path.dirname与os.getcwd在脚本执行路径获取上的差异及正确用法,提供了完整的配置与运行指南。

前言与背景

前言

此前曾发布过一篇关于使用Python实现百度新歌榜与热歌榜下载器的文章,成功实现了歌曲信息的爬取与下载功能。然而,原版本采用单线程模式,在网络环境一般的情况下,扫描前100首歌曲耗时约40秒。此外,基于PyQt构建的界面在下载过程中进行窗口操作时,会出现UI阻塞现象,影响用户体验。

主要改进内容

近期对代码进行了调整与优化,主要改进点如下:

1. 解决了UI界面阻塞问题,确保在下载过程中仍可执行其他UI操作;

2. 爬虫程序采用1个主线程配合8个子线程的多线程模式,显著提升了爬取速度。在网络状况一致的前提下,扫描100首歌曲的时间缩短至8至9秒左右(本地下载速度约为300KB/s);

3. 网页解析方法由原来的HtmlParser升级为BeautifulSoup,提高了解析效率与稳定性;

运行此功能需预先安装PyQt和BeautifulSoup库。在运行前,必须在settings.py文件中正确配置百度账号和密码。


username = "your baidu acount" #配置你的百度账号 
password = "your baidu password" #配置你的百度密码 

完成账户和密码配置后,直接双击运行spiderMan.py文件即可启动程序。

运行流程说明

运行流程

1. 程序由spiderMan.py作为入口文件启动主程序;

2. 主程序将控制权移交至dispatcher调度程序,该程序首先执行百度登录操作;

3. 若登录成功,调度程序将开启8个子线程。这些子线程负责抓取百度新歌榜或热歌榜的歌曲链接,分析链接以获取真实下载地址,并将下载地址、歌曲名称及歌手信息写入文本文件;

4. 当所有子线程执行完毕后,主程序读取上一步生成的文本文件,并加载UI窗体展示结果;

整个过程逻辑如下图所示:

正常运行后的界面效果如下所示:

常见问题与路径解析

常见问题与解答:

在GitHub上,用户tigerstudent提出了两个关键问题:

1. 在文件spiderMan.py中,获取当前脚本所在目录的代码 root = os.path.dirname(__file__)+"/" 返回结果为空,建议改用os.getcwd()。

实际上,此处需要获取的是当前脚本所在的绝对路径。正确的代码写法应为:os.path.abspath(os.path.dirname(__file__))+"/"

那么,为什么 os.path.dirname(__file__) 和 os.getcwd() 无法达到预期效果呢?os.path.dirname(__file__) 返回的是当前脚本相对于脚本执行目录的相对路径,而 os.getcwd() 返回的是脚本实际执行的目录。为了说明这一点,新建一个test.py文件,代码如下:


import os 
print("os.path.dirname(__file__):"+os.path.dirname(__file__)) 
print("os.getcwd():"+os.getcwd()) 

首先,定位到计算机根目录 /,执行以下命令:python /home/fengzheng/vimPython/BaiduMusicSpider-master/test.py,输出结果为:


os.path.dirname(__file__):/home/fengzheng/vimPython/BaiduMusicSpider-master 
os.getcwd(): 

接着,定位到 /home/fengzheng/vimPython/ 目录,执行以下命令:python BaiduMusicSpider-master/test.py,输出结果为:


os.path.dirname(__file__):BaiduMusicSpider-master 
os.getcwd():/home/fengzheng/vimPython 

简单来说,抛开具体的参数值,在Windows环境下可将命令理解为直接双击运行脚本的操作。此时,os.path.dirname(__file__) 表示所执行的脚本文件相对于当前所处目录的相对路径,而 os.getcwd() 则表示当前执行该脚本所在的路径,即无论在哪里执行,返回的都是执行时的当前工作目录路径。

2. 部分路径字符串中使用了反斜杠“\”,正确的写法应使用正斜杠“/”。这是由于最初在Windows环境下编写代码时未注意路径分隔符的差异所致。

GitHub项目下载地址:下载地址

以上就是本文的全部内容,希望本文能对各位的学习有所帮助,也欢迎大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。