zoukankan      html  css  js  c++  java
  • 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~~同时祝大家新年愉快~~哈哈哈

  • 相关阅读:
    AUDIT审计的一些使用
    HOW TO PERFORM BLOCK MEDIA RECOVERY (BMR) WHEN BACKUPS ARE NOT TAKEN BY RMAN. (Doc ID 342972.1)
    使用BBED理解和修改Oracle数据块
    Using Class of Secure Transport (COST) to Restrict Instance Registration in Oracle RAC [ID 1340831.1]
    调试利器GDB概念
    第4章 思科IOS
    第3章 ip地址和子网划分
    第2章 TCPIP
    2020年阅读过的黑客资源推荐篇
    第1章 计算机网络
  • 原文地址:https://www.cnblogs.com/skying555/p/5984192.html
Copyright © 2011-2022 走看看