日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python多線程下載有聲小說

有經(jīng)驗(yàn)的老鳥都(未婚的)會(huì)在公司附近租房,免受舟車勞頓之苦的同時(shí)節(jié)約了大把時(shí)間;也有些人出于某種原因需要每天披星戴月地游走于公司與家之間,很不幸俺就是這其中一員。由于家和公司離得比較遠(yuǎn),我平時(shí)在公交車上的時(shí)間占據(jù)了工作時(shí)間段的1/4,再加上杭州一向有中國的拉斯維加斯之稱(堵城),每每堵起來,哥都能想象自己成為變形金剛。這段漫長時(shí)間我想作為每個(gè)程序猿來說是無法忍受的,可是既然短時(shí)間無法改變生存的現(xiàn)狀,咱就好好利用這段時(shí)間吧。所以,我特地買了大屏幕的Note II 以便看pdf,另外耳朵也不能閑著,不過咱不是聽英語而是聽小說,我在讀書的時(shí)候就喜歡聽廣播,特別是說書、相聲等,所以我需要大量的有聲小說,現(xiàn)在網(wǎng)上這些資源多的很,但是下載頁記為麻煩,為了掙取更多的流量和廣告點(diǎn)擊,這些網(wǎng)站的下載鏈接都需要打開至少兩個(gè)以上的網(wǎng)頁才能找到真正的鏈接,甚是麻煩,為了節(jié)省整體下載時(shí)間,我寫了這個(gè)小程序,方便自己和大家下載有聲小說(當(dāng)然,還有任何其他類型的資源)

先說明一下,我不是為了爬很多資料和數(shù)據(jù),僅僅是為了娛樂和學(xué)習(xí),所以這里不會(huì)漫無目的的取爬取一個(gè)網(wǎng)站的所有鏈接,而是給定一個(gè)小說,比方說我要下載小說《童年》,我會(huì)在我聽評(píng)書網(wǎng)上找到該小說的主頁然后用程序下載所有mp3音頻,具體做法見下面代碼,所有代碼都在模塊crawler5tps中:

1. 先設(shè)定一下start url 和保存文件的目錄

  
 
 
 
  1. #-*-coding:GBK-*-  
  2.  import urllib,urllib2  
  3.  import re,threading,os  
  4.  baseurl = 'http://www.5tps.com' #base url   
  5.  down2path = 'E:/enovel/'        #saving path  
  6.  save2path = ''                  #saving file name (full path) 

2. 從start url 解析下載頁面的url

  
 
 
 
  1. def parseUrl(starturl):  
  2.      '''''  
  3.      parse out download page from start url.  
  4.      eg. we can get 'http://www.5tps.com/down/8297_52_1_1.html' from 'http://www.5tps.com/html/8297.html'  
  5.      ''' 
  6.      global save2path  
  7.      rDownloadUrl = re.compile(".*?
  8.      #rTitle = re.compile(".{4}\s{1}(.*)\s{1}.*")  
  9.      #有聲小說 悶騷1 播音:劉濤 全集  
  10.      f = urllib2.urlopen(starturl)  
  11.      totalLine =  f.readlines()  
  12.        
  13.     ''''' create the name of saving file ''' 
  14.      title = totalLine[3].split(" ")[1]  
  15.      if os.path.exists(down2path+title) is not True:  
  16.          os.mkdir(down2path+title)  
  17.          save2path = down2path+title+"/" 
  18.        
  19.      downUrlLine = [ line for line in totalLine if rDownloadUrl.match(line)]  
  20.      downLoadUrl = [];  
  21.      for dl in downUrlLine:  
  22.          while True:  
  23.              m = rDownloadUrl.match(dl)  
  24.              if not m:  
  25.                  break 
  26.              downUrl = m.group(1)  
  27.              downLoadUrl.append(downUrl.strip())  
  28.              dl = dl.replace(downUrl,'')  
  29.      return downLoadUrl 

3. 從下載頁面解析出真正的下載鏈接

  
 
 
 
  1. def getDownlaodLink(starturl):  
  2.      '''''  
  3.      find out the real download link from download page.  
  4.      eg. we can get the download link 'http://180j-d.ysts8.com:8000/人物紀(jì)實(shí)/童年/001.mp3?\  
  5.      1251746750178x1356330062x1251747362932-3492f04cf54428055a110a176297d95a' from \  
  6.      'http://www.5tps.com/down/8297_52_1_1.html'  
  7.      ''' 
  8.      downUrl = []  
  9.      gbk_ClickWord = '點(diǎn)此下載' 
  10.      downloadUrl = parseUrl(starturl)  
  11.      rDownUrl = re.compile(''+gbk_ClickWord+'.*') #find the real download link  
  12.      for url in downloadUrl:  
  13.          realurl = baseurl+url  
  14.          print realurl  
  15.          for line in urllib2.urlopen(realurl).readlines():  
  16.              m = rDownUrl.match(line)  
  17.              if m:  
  18.                  downUrl.append(m.group(1))  
  19.      
  20.      return downUrl 

4. 定義下載函數(shù)

  
 
 
 
  1. def download(url,filename):  
  2.      ''''' download mp3 file ''' 
  3.      print url  
  4.      urllib.urlretrieve(url, filename) 

5. 創(chuàng)建用于下載文件的線程類

  
 
 
 
  1. class DownloadThread(threading.Thread):  
  2.      ''''' dowanload thread class ''' 
  3.      def __init__(self,func,savePath):  
  4.          threading.Thread.__init__(self)  
  5.          self.function = func  
  6.          self.savePath = savePath  
  7.        
  8.      def run(self):  
  9.          download(self.function,self.savePath) 

6. 開始下載

  
 
 
 
  1. if __name__ == '__main__':  
  2.      starturl = 'http://www.5tps.com/html/8297.html' 
  3.      downUrl = getDownlaodLink(starturl)  
  4.      aliveThreadDict = {}        # alive thread  
  5.      downloadingUrlDict = {}     # downloading link  
  6.    
  7.      i = 0;  
  8.      while i < len(downUrl):  
  9.          ''''' Note:我聽評(píng)說網(wǎng) 只允許同時(shí)有三個(gè)線程下載同一部小說,但是有時(shí)受網(wǎng)絡(luò)等影響,\  
  10.                          為確保下載的是真實(shí)的mp3,這里將線程數(shù)設(shè)為2 ''' 
  11.          while len(downloadingUrlDict)< 2 :  
  12.              downloadingUrlDict[i]=i  
  13.              i += 1 
  14.          for urlIndex in downloadingUrlDict.values():  
  15.              #argsTuple = (downUrl[urlIndex],save2path+str(urlIndex+1)+'.mp3')  
  16.              if urlIndex not in aliveThreadDict.values():  
  17.                  t = DownloadThread(downUrl[urlIndex],save2path+str(urlIndex+1)+'.mp3')  
  18.                  t.start()  
  19.                  aliveThreadDict[t]=urlIndex  
  20.          for (th,urlIndex) in aliveThreadDict.items():  
  21.              if th.isAlive() is not True:  
  22.                  del aliveThreadDict[th] # delete the thread slot  
  23.                  del downloadingUrlDict[urlIndex] # delete the url from url list needed to download   
  24.        
  25.      print 'Completed Download Work' 

這樣就可以了,讓他盡情的下吧,咱還得碼其他的項(xiàng)目去,哎 >>>

等下了班copy到Note中就可以一邊聽小說一邊看資料啦,***附上源碼。

原文鏈接:http://www.cnblogs.com/wuren/archive/2012/12/24/2831100.html


網(wǎng)站名稱:Python多線程下載有聲小說
當(dāng)前路徑:http://m.5511xx.com/article/codsdse.html