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

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

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

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

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

#!/usr/bin/python# -*- Coding: utf-8 -*-''' 百度中批量下载某歌手的歌(目前只下载第一页,可以自行拓展) @author:admin @qq: 1243385033'''import threading,urllib2,os,re,sysfrom bs4 import BeautifulSoupfrom Queue import Queue'''目标歌手'''SINGER = u'亚东''''保存路径'''SAVE_FolDER = 'F:/music/'# 查询urlsearch_url = "http://music.baIDu.com/search/song?key=%s&s=1"# 百度音乐播放盒urlsong_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.taskdef 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多线程结合队列下载百度音乐的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1205241.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存