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 22 Python
Python实现Linux命令xxd -i功能
Mar 06 Python
Python的时间模块datetime详解
Apr 17 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
Jun 06 Python
python 3.6.5 安装配置方法图文教程
Sep 18 Python
pycharm的console输入实现换行的方法
Jan 16 Python
关于Python3 lambda函数的深入浅出
Nov 27 Python
python enumerate内置函数用法总结
Jan 07 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
导致python中import错误的原因是什么
Jul 01 Python
Python绘图之柱形图绘制详解
Jul 28 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
Aug 28 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中++i 与 i++ 的区别
2012/08/08 PHP
php检测文件编码的方法示例
2014/04/25 PHP
php正则表达式学习笔记
2015/11/13 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
js获取变量
2006/08/24 Javascript
JavaScript 不只是脚本
2007/05/30 Javascript
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
python的Template使用指南
2014/09/11 Python
详解在Python程序中解析并修改XML内容的方法
2015/11/16 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
求职自荐信格式
2013/12/04 职场文书
千元咖啡店的创业计划书范文
2013/12/29 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
南京导游词
2015/02/03 职场文书
小升初自荐信范文
2015/03/05 职场文书
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers