python3自動下載優酷視頻小程序


   我們一般都在優酷里看一些好玩的視頻,有時候看到精彩的就想下載到本地保存起來留作紀念,在win下可以用維棠等軟件下載,但苦了用linux的孩子們。盡管chrome和firefox的一些插件可以下載,但有時候下載下來是分段的視頻,還要手動用ffmpeg合成一個視頻太繁瑣,而且用插件下載要點擊好多次鼠標,太不符合linuxer的性格了哈~於是我用python3寫了一個youkuDown.py,代碼如下:

 

[python]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. import re  
  2. import urllib.request  
  3. import json  
  4. import time  
  5. import random  
  6. import sys  
  7.   
  8. def getVideoInfo(url):  
  9.     ruleTitle=re.compile('<title>(.*)</title>')  
  10.     ruleId=re.compile('http://v.youku.com/v_show/id_(.*).html')  
  11.     videoTitle=ruleTitle.findall(urllib.request.urlopen(url).read().decode('utf8'))  
  12.     videoId=ruleId.findall(url)  
  13.     return videoTitle[0],videoId[0]  
  14.   
  15. def getTrueLink(videoid):  
  16.     data=urllib.request.urlopen('http://v.youku.com/player/getPlayList/VideoIDS/'+videoid)  
  17.     info=json.loads(data.read().decode('utf8'))  
  18.   
  19.     segs=info['data'][0]['segs']  
  20.     types=segs.keys()  
  21.   
  22.     seed=info['data'][0]['seed']  
  23.     source=list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890")  
  24.     mixed=''  
  25.     while source:  
  26.         seed=(seed*211+30031)&0xFFFF  
  27.         index=seed*len(source)>>16  
  28.         c=source.pop(index)  
  29.         mixed+=c  
  30.   
  31.     ids=info['data'][0]['streamfileids']['flv'].split('*')[:-1]  
  32.     vid=''.join(mixed[int(i)] for i in ids)  
  33.   
  34.     sid='%s%s%s'%(int(time.time()*1000),random.randint(1000,1999),random.randint(1000,9999))  
  35.   
  36.     urls=[]  
  37.     for s in segs['flv']:  
  38.         no='%02x'%int(s['no'])  
  39.         url='http://f.youku.com/player/getFlvPath/sid/%s_%s/st/flv/fileid/%s%s%s?K=%s&ts=%s'%(sid,no,vid[:8],no.upper(),vid[10:],s['k'],s['seconds'])  
  40.         urls.append(url)  
  41.     return urls  
  42.   
  43. def down2file(urls,filename):  
  44.     f=open(filename,'wb')  
  45.     fileNum=len(urls)  
  46.     count=0  
  47.     for url in urls:  
  48.         count+=1  
  49.         print('downloading file %d/%d'%(count,fileNum))  
  50.         req=urllib.request.Request(url,headers={'Referer':'http://www.youku.com'})  
  51.         data=urllib.request.urlopen(req).read()  
  52.         f.write(data)  
  53.     f.close()  
  54.     print('download '+filename+' OK!')  
  55.   
  56. def youkuDown(link):  
  57.     videotitle,videoid=getVideoInfo(link)  
  58.     urls=getTrueLink(videoid)  
  59.     down2file(urls,videotitle+'.flv')  
  60.   
  61. if __name__=='__main__':  
  62.     if len(sys.argv)<2:  
  63.         print('Example Usage: python3 youkuDown.py http://v.youku.com/v_show/id_XNjUzNDQwMzIw.html')  
  64.         print('')  
  65.         exit()   
  66.     youkuDown(sys.argv[1])  


        簡單說明一下,因為優酷視頻的真實鏈接是動態變化的,而每個視頻的ID是不變的,比如在鏈接http://v.youku.com/v_show/id_XNjUzNDQwMzIw.html中,“XNjUzNDQwMzIw”就是視頻的唯一ID標識,通過這個ID可以通過GET方式請求“http://v.youku.com/player/getPlayList/VideoIDS/”+ID產生的新鏈接,得到json格式的視頻信息,然后組裝成視頻的真實鏈接,這個真實鏈接也是有時效性的,而且向這個真實鏈接發起請求的時候必須把頭的Referer設為www.youku.com騙過服務器才能下載,所以我沒有像以前一樣用os.system('wget '+url)這樣搞起。還有,優酷對大的視頻是分段的,所以得到的真實url我存在一個List里面,下載的時候會顯示出共有幾段以及實時下載了多少段。下面是我的使用舉例:

 

 

保存到本地的視頻播放情況:

        在linux下想下載優酷視頻的盆友們enjoy it~~同時祝大家新年愉快~~哈哈哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM