之前写过一个用python实现的百度新歌榜、热歌榜下载器的博文,实现了百度新歌、热门歌曲的爬取与下载。但那个采用的是单线程,网络状况一般的情况下,扫描前100首歌的时间大概得到40来秒。而且用Pyqt做的界面,在下载的过程中进行窗口操作,会出现UI阻塞的现象。

前两天有时间调整了一下,做了几方面的改进:

1.修改了UI界面阻塞的问题,下载的过程中可以进行其它的UI操作;

2.爬虫程序采用一个主线程,8个子线程的方式快速爬取,网络状况一致的情况下,将扫描100首歌曲的时间提高到了8、9秒左右;(本地下载速度大概300K左右)

3.解析网页的方法由之前的HtmlParser变成了现在的BeautifulSoup;

要运行此功能需要安装PyQt、BeautifulSoup。运行之前需要在settings.py文件中配置百度账号和密码。

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

配置好账户和密码后,直接双击spiderMan.py文件运行即可。

运行流程

1.首先由spiderMan.py进入主程序,开始运行。

2.主程序将控制权交给dispatcher调度程序,调度程序首先登录百度。

3.如果登录成功,调度程序开启8个子线程,由这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实现的百度音乐下载器-python-pyqt-改进版的更多相关文章

  1. Qt+Python开发百度图片下载器

    一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->收费->百度图片下载器(可试用5分钟) 安装包直接下载地址:htt ...

  2. Python实战:美女图片下载器,海量图片任你下载

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  3. SongTaste音乐下载器

    SongTaste音乐下载器 Songtaste是一个非常好的音乐推荐网站, 奈何和duomi搅合在一起, 导致下载音乐非常的麻烦, 现在写了一个简单的"下载器", 通过它可以下载 ...

  4. 精品工具【音乐下载器(可下载VIP音乐)】

    工具信息 更新时间:2020年5月26日00点07分更新内容:1. 增加快捷键2. 细分下载列表清除功能一款可以下载付费音乐的音乐下载器 下载链接:https://nitian1207.lanzous ...

  5. 使用python做一个IRC在线下载器

    使用python做一个IRC在线下载器 1.开发流程 2.软件流程 3.开始 3.0 准备工作 3.1寻找API接口 3.2 文件模块 3.2.1 选择文件弹窗 3.2.2 提取文件名 3.2.2.1 ...

  6. 用 python 实现一个多线程网页下载器

    今天上来分享一下昨天实现的一个多线程网页下载器. 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. k ...

  7. Android获取百度音乐下载音乐和歌词下载链接

    首先,你必须通过以下连接下载歌曲: http://box.zhangmen.baidu.com/x?op=12&count=1&title={title}$${author}$$$$ ...

  8. 使用python打造一款音乐播放器

    作者qq:64761294 编程/考试交流群:834531270 欢迎交流 核心播放模块(pygame内核) import time import pygame import easygui as g ...

  9. 百度文库下载器 V2.3.4.3 支持豆丁百度文库道客巴巴

    支持豆丁百度文库道客巴巴免下载劵财富值导出word 下载地址: http://pan.baidu.com/s/1qYCmQde

随机推荐

  1. 解决 U 盘写保护的问题

    插了一个 U 盘,想格式化或者创建文件,但是提示我 U 盘是写保护的. 解决方法如下: Open a command prompt type DISKPART press type LIST VOLU ...

  2. Flex Layout Attribute

    GitHub: https://github.com/StefanKovac/flex-layout-attribute 引入基本的样式,可以更好的布局,可以在线制作: http://progress ...

  3. Maven仓库 国内镜像

    <repositories> <repository> <id>repo-mirror</id> <url>http://maven.net ...

  4. struts2注解

    一.配置web.xml <filter> <filter-name>struts2</filter-name> <filter-class>org.ap ...

  5. 【面试题】M

    一面: 1.介绍实习项目: 2.计算二叉树叶子节点的数量: 3.排序算法有哪些,手写快排: 4.长度为100的数组,值为1~100,乱序,将其中一个值改为0,找出被更改的值以及位置: 5.输入数值0~ ...

  6. 我的Windows Phone 8

    学习Windows Phone 8开发,将自己收集到的学习资料做一个汇总(不断更新). 我的Windows Phone应用 DotaMax MyAppToStart 麦子学院 WP8.1版(UI简陋) ...

  7. content相关属性

    content属性值 :      width:可视区域的宽度,值可为数字或关键词device-width      height:同width      intial-scale:页面首次被显示是可 ...

  8. C# SQL 面试题自我总结

    1,asp.net单点登录机制 2,多线程同步机制 3,写一个冒泡排序算法 4,写一个递归算法 5,字符串反转 字符串分隔后调用reverse 方法. 6,sql 中ID自动增长,查询31到40条记录 ...

  9. windows service 1053错误 启动失败

    做项目移植的时候发现一个项目的window service启动失败,最后试出来是启动时间超时 解决办法是给window service设置一个长一点的等待时间,步骤如下: 启动,输入regedit启动 ...

  10. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...