本文实例讲述了Python多线程结合队列下载百度音乐的方法。分享给大家供大家参考。具体如下:

一直想做个下载音乐的脚本,后来决定就拿百度音乐开刀,经过多次分析,终于制作了一个下载百度音乐的脚本,目前只默认下载第一页,童鞋们可以自由拓展。
适用Windows和Linux平台、依赖BeautifulSoup这个库,主要对HTML进行解析

#!/usr/bin/python
# -*- coding: utf-8 -*-
'''百度中批量下载某歌手的歌(目前只下载第一页,可以自行拓展)@author:admin@qq: 1243385033
'''
import threading, urllib2, os,re,sys
from bs4 import BeautifulSoup
from Queue import Queue
'''目标歌手'''
SINGER = u'亚东'
'''保存路径'''
SAVE_FOLDER = 'F:/music/'
# 查询url
search_url = "http://music.baidu.com/search/song?key=%s&s=1"
# 百度音乐播放盒url
song_url = "http://box.zhangmen.baidu.com/x?op=12&count=1&mtype=1&title="
class Downloader(threading.Thread):def __init__(self, task):threading.Thread.__init__(self)self.task = taskdef run(self):'''覆盖父类的run方法'''while True:url = self.task.get()self.download(url)self.task.task_done()def build_path(self, filename):join = os.path.joinparentPath=join(SAVE_FOLDER,SINGER)filename = filename + '.mp3'myPath = join(parentPath, filename)return myPathdef download(self, url):'''下载文件'''sub_url = url.items()f_name = sub_url[0][0]req_url = sub_url[0][1]handle = urllib2.urlopen(req_url)# 保存路径save_path = self.build_path(f_name)with open(save_path, "wb") as handler:while True:chunk = handle.read(1024)if not chunk:breakhandler.write(chunk)msg = u"已经从 %s下载完成" % req_urlsys.stdout.write(msg)sys.stdout.flush()
class HttpRequest:def __init__(self):self.task = []self.reg_decode = re.compile('<decode>.*?CDATA\[(.*?)\]].*?</decode>')self.reg_encode = re.compile('<encode>.*?CDATA\[(.*?)\]].*?</encode>')self.init()self.target_url = search_url % urllib2.quote(self.encode2utf8(SINGER))def encode2utf8(self,source):if source and isinstance(source,(str,unicode)):source=source.encode("utf8")return sourcereturn sourcedef mkDir(self, dir_name):if not os.path.exists(dir_name):os.mkdir(dir_name)def init(self):self.mkDir(SAVE_FOLDER)subPath = os.path.join(SAVE_FOLDER, SINGER)self.mkDir(subPath)def http_request(self):global song_url'''发起请求'''response=urllib2.urlopen(self.target_url)# 获取头信息content = response.read()response.close()# 使用BeautifulSouphtml = BeautifulSoup(content, from_encoding="utf8")# 提取HTML标签span_tag = html.find_all('div', {"monkey":"song-list"})[0].find_all('span', class_='song-title')# 遍历Listfor a_tag in span_tag:song_name = unicode(a_tag.find_all("a")[0].get_text())song_url = song_url + urllib2.quote(self.encode2utf8(song_name))song_url = song_url + '$$' + urllib2.quote(self.encode2utf8(SINGER)) + '$$$$&url=&listenreelect=0&.r=0.1696378872729838'xmlfile = urllib2.urlopen(song_url)xml_content = xmlfile.read()xmlfile.close()url1 = re.findall(self.reg_encode, xml_content)url2 = re.findall(self.reg_decode, xml_content)if not url1 or not url2:continueurl = url1[0][:url1[0].rindex('/') + 1] + url2[0]self.task.append({song_name:url})return self.task
def start_download(urls):#创建一个队列quene=Queue()#获取list的大小size=len(urls)#开启线程for _ in xrange(size):t=Downloader(quene)t.setDaemon(True)t.start()#入队列for url in urls:quene.put(url)quene.join()
if __name__=='__main__':http=HttpRequest()urls=http.http_request()start_download(urls)

非常感谢你的阅读
大学的时候选择了自学python,工作了发现吃了计算机基础不好的亏,学历不行这是没办法的事,只能后天弥补,于是在编码之外开启了自己的逆袭之路,不断的学习python核心知识,深入的研习计算机基础知识,整理好了,我放在我们的Python学习扣qun:774711191,如果你也不甘平庸,那就与我一起在编码之外,不断成长吧!

其实这里不仅有技术,更有那些技术之外的东西,比如,如何做一个精致的程序员,而不是“屌丝”,程序员本身就是高贵的一种存在啊,难道不是吗?[点击加入]想做你自己想成为高尚人,加油!

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府

Python多线程结合队列下载百度音乐的方法相关推荐

  1. PYTHON 2.7爬虫获取百度音乐文件(按歌手名或歌曲名均可)

    2018.8.3 有点小错误正在修改!!!!    2018.8.6 修正完毕,存在小问题(歌手有多个,会创建多个文件夹)   最近学习了关于python的一点点知识,做出一点点小小程序来帮助自己加深 ...

  2. python爬虫实现批量下载百度图片

    今天和小伙伴们合作一个小项目,需要用到景点图片作为数据源,在百度上搜索了一些图片,感觉一个一个手动保存太过麻烦,于是想到用爬虫来下载图片. 本次代码用到了下列一些python模块,需要预先安装Beau ...

  3. linux 下载百度网盘方法

    linux 使用bypy下载百度网盘方法 1.安装bypy python库 pip install bypy -i https://pypi.douban.com/simple 2.在网页上登陆百度云 ...

  4. python下载百度音乐

    之前看到有人写过类似的代码,感觉有点累赘,其中登陆那些东西其实可以避免的 我把百度音乐的网页代码稍微分析了一下,如果要求不高,下载普通音质的歌曲是不需要登陆的(当然如果你用浏览器打开下载的话,普通音质 ...

  5. python 下载百度音乐

    最近在学习python,恰巧手上有某位大神无聊写的从百度上下载音乐的脚本,拿来学习学习. 在学习这个脚本前,必须得了解的一点是,百度音乐有自己的API供我们调用的(开始看到这个脚本的时候真是没想到这点 ...

  6. 用python可以免费下载音乐吗-Python 教你轻松下载网易音乐歌曲

    前两篇文章收集了歌手信息和歌词,光有歌手信息和歌词没有歌曲怎么行,那不是耍流氓吗?正好今天周末,给大家发点福利,喜欢听音乐的同学有福了,这篇文章直接把网易云音乐歌手的热门歌曲 50 首全部免费下载下来 ...

  7. Python 教你轻松下载网易音乐歌曲

    点击上方"brucepk",选择"置顶公众号" 第一时间关注 Python 技术干货! "   阅读文本大概需要 2.8 分钟 前两篇文章收集了歌手信 ...

  8. PYTHON——多线程:队列Queue数据结构

    1.队列模块简介 队列是一种数据结构,用于存放数据,类似列表.它是先进先出模式(FIFO模式),类似管道一般: 单线程不需要用到队列Queue,它主要用在多线程之间的,Queue称为多线程利器. 列表 ...

  9. Python多线程和队列结合demo

    一.使用场景 大家都知道python的多线程不是真正的多线程,但是对于io类型的任务,多线程还是能发挥作用的.那么多个线程之间是如何进行变量共享的呢,很多时候我们可以借助queue模块,方便.今天就做 ...

最新文章

  1. windows系统服务器数据库,windows系统的服务器肿么访问数据库
  2. # 小猪的Python学习之旅 —— 17.Python数据分析:我主良缘交友了解下
  3. mysql数据库驱动_JDBC 加载mysql数据库驱动
  4. 非常适合小白的 Asyncio 教程
  5. [转]配置nginx+apache 其中动态由apache处理,静态由nginx处理
  6. 视频编解码器,bbv 缓冲区溢出和下溢
  7. leetcode—16.两数相加链表python解答
  8. 计算机二级职业生涯规划讲座心得,职业规划讲座心得体会-
  9. 网易蜗牛读书产品分析报告
  10. 硬件基础:嵌入式软件可靠性设计要注意的问题
  11. java 什么是计算机
  12. 机顶盒开发助手Tvbox
  13. delphi中setTimer函数的用法
  14. android bitmap转nv21(YUV420SP)
  15. 逻辑推理题的思路规律
  16. Web安全-表单域隐藏
  17. 还记得最初的梦想么?——2018年小结
  18. 【Yocto学习入门】02 - 构建一个简单的Poky参考嵌入式操作系统
  19. [music]Brand new day--Ryan Star
  20. X3650M5更换主板后无法正常进系统的原因

热门文章

  1. 自学了半个月感觉一点也没学会Python,Python真的有这么难学吗
  2. Android进程保活(如何尽可能避免APP被杀死)
  3. OpenWrt 初始化(中文界面/挂载U盘/smb共享/分区/格式化)
  4. 视频教程-微信小程序商城-界面设计实战教学(含源代码)-微信开发
  5. jsp+ssm+mysql实现图书馆预约占座管理系统项目
  6. aix修改日志服务器,配置aix将audit日志发送syslog服务器
  7. 朴素贝叶斯分类器NBC
  8. 浅谈python的特点
  9. javascript生成二维码
  10. Mysql常见面试问题整理(二):索引