国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python多線程結(jié)合隊列下載百度音樂的方法

2019-11-25 17:07:32
字體:
供稿:網(wǎng)友

本文實例講述了Python多線程結(jié)合隊列下載百度音樂的方法。分享給大家供大家參考。具體如下:

一直想做個下載音樂的腳本,后來決定就拿百度音樂開刀,經(jīng)過多次分析,終于制作了一個下載百度音樂的腳本,目前只默認下載第一頁,童鞋們可以自由拓展。
適用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"已經(jīng)從 %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    '''發(fā)起請求'''    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):  #創(chuàng)建一個隊列  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程序設(shè)計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 元氏县| 常山县| 含山县| 沙湾县| 双峰县| 仁寿县| 洛浦县| 吉木乃县| 洪湖市| 靖宇县| 达州市| 岢岚县| 汪清县| 乐至县| 英山县| 青田县| 胶州市| 唐河县| 禹州市| 醴陵市| 靖远县| 科技| 岳阳县| 高阳县| 炎陵县| 永川市| 扎赉特旗| 宁远县| 商河县| 封开县| 五华县| 洪江市| 安陆市| 精河县| 高邑县| 进贤县| 叶城县| 兴城市| 东宁县| 江都市| 新密市|