Python PyQt多线程百度音乐下载器优化与路径问题解析
本文介绍了一款基于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项目下载地址:下载地址
以上就是本文的全部内容,希望本文能对各位的学习有所帮助,也欢迎大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













