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


Posted in Python onJuly 27, 2015

本文实例讲述了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 = task
  def run(self):
    '''覆盖父类的run方法'''
    while True:
      url = self.task.get()
      self.download(url)
      self.task.task_done()
  def build_path(self, filename):
    join = os.path.join
    parentPath=join(SAVE_FOLDER,SINGER)
    filename = filename + '.mp3'
    myPath = join(parentPath, filename)
    return myPath
  def 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:
          break
        handler.write(chunk)
        msg = u"已经从 %s下载完成" % req_url
      sys.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 source
    return source
  def 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()
    # 使用BeautifulSoup
    html = BeautifulSoup(content, from_encoding="utf8")
    # 提取HTML标签
    span_tag = html.find_all('div', {"monkey":"song-list"})[0].find_all('span', class_='song-title')
      # 遍历List
    for 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:
        continue
      url = 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解决字典中的值是列表问题的方法
Mar 04 Python
python实现无证书加密解密实例
Oct 27 Python
详解Python中的正则表达式的用法
Apr 09 Python
python通过函数属性实现全局变量的方法
May 16 Python
Python中的with...as用法介绍
May 28 Python
python中执行shell的两种方法总结
Jan 10 Python
python处理csv中的空值方法
Jun 22 Python
python抓取京东小米8手机配置信息
Nov 13 Python
pandas 数据结构之Series的使用方法
Jun 21 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
Numpy数组的广播机制的实现
Nov 03 Python
在Django框架中设置语言偏好的教程
Jul 27 #Python
在Python的Django框架中创建语言文件
Jul 27 #Python
在Django的模型和公用函数中使用惰性翻译对象
Jul 27 #Python
使用Django的模版来配合字符串翻译工作
Jul 27 #Python
Django中的“惰性翻译”方法的相关使用
Jul 27 #Python
在Python中的Django框架中进行字符串翻译
Jul 27 #Python
Python中特殊函数集锦
Jul 27 #Python
You might like
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
用jscript启动sqlserver
2007/06/21 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
Javascript Global对象
2009/08/13 Javascript
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
AngularJS 执行流程详细介绍
2016/08/18 Javascript
Node.js简单入门前传
2017/08/21 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
python迭代器与生成器详解
2016/03/10 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
python判断设备是否联网的方法
2018/06/29 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
python requests证书问题解决
2019/09/05 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
使用python实现多维数据降维操作
2020/02/24 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
python属于哪种语言
2020/08/16 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
儿科护士实习自我鉴定
2013/10/17 职场文书
婚礼主持结束词
2014/03/13 职场文书
大学生村官工作心得体会
2016/01/23 职场文书