• 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~~同时祝大家新年愉快~~哈哈哈

  • 相关阅读:
    全文索引的书
    图片上传预览
    sqlserver 递归删除组织结构树
    dataset 转泛型list
    jquery easyui tree 异步加载数据
    sqlserver 禁用外键
    linx 实用操作命令二
    Compilation failed: this version of PCRE is not compiled with PCRE_UTF8 support at offset 0
    Centos linux php扩展安装步骤
    linux Apache和php配置
  • 原文地址:https://www.cnblogs.com/skying555/p/5984192.html
Copyright © 2020-2023  润新知