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缩进和冒号详解
Jun 01 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 Python
面向对象学习之pygame坦克大战
Sep 11 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
Django封装交互接口代码
Jul 12 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
Nov 25 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
Python如何使用神经网络进行简单文本分类
Feb 25 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 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 PDO中文乱码解决办法
2009/07/20 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
起点页面传值js,有空研究学习下
2010/01/25 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
Vue组件通信的几种实现方法
2019/04/25 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
美国性感女装网站:bebe
2017/03/04 全球购物
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
生产厂长岗位职责
2014/02/21 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
导游词之岳阳楼
2019/09/25 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
Java中的随机数Random
2022/03/17 Java/Android