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实现打印螺旋矩阵功能的方法
Nov 21 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
Python闭包和装饰器用法实例详解
May 22 Python
pandas实现将dataframe满足某一条件的值选出
Jun 12 Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 Python
如何用Python制作微信好友个性签名词云图
Jun 28 Python
Python实现Singleton模式的方式详解
Aug 08 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
使用django自带的user做外键的方法
Nov 30 Python
python+pyhyper实现识别图片中的车牌号思路详解
Dec 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多图上传小程序代码
2011/07/17 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
window.open的功能全解析
2006/10/10 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
jQuery插件scroll实现无缝滚动效果
2015/04/27 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
使用apifm-wxapi模块中的问题及解决方法
2019/08/05 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
Python 爬虫多线程详解及实例代码
2016/10/08 Python
python使用插值法画出平滑曲线
2018/12/15 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
Python配置文件处理的方法教程
2019/08/29 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
ktv收银员岗位职责
2013/12/16 职场文书
支部组织生活会方案
2014/06/10 职场文书
驻村工作先进事迹
2014/08/14 职场文书
学校师德师风整改方案
2014/10/28 职场文书
员工辞退通知书
2015/04/17 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
消费者理赔投诉书
2015/07/02 职场文书
2016年感恩节活动总结大全
2016/04/01 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
Python关于OS文件目录处理的实例分享
2021/05/23 Python
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python