我们一般都在优酷里看一些好玩的视频,有时候看到精彩的就想下载到本地保存起来留作纪念,在win下可以用维棠等软件下载,但苦了用linux的孩子们。尽管chrome和firefox的一些插件可以下载,但有时候下载下来是分段的视频,还要手动用ffmpeg合成一个视频太繁琐,而且用插件下载要点击好多次鼠标,太不符合linuxer的性格了哈~于是我用python3写了一个youkuDown.py,代码如下:

  1. import re
  2. import urllib.request
  3. import json
  4. import time
  5. import random
  6. import sys
  7. def getVideoInfo(url):
  8. ruleTitle=re.compile('<title>(.*)</title>')
  9. ruleId=re.compile('http://v.youku.com/v_show/id_(.*).html')
  10. videoTitle=ruleTitle.findall(urllib.request.urlopen(url).read().decode('utf8'))
  11. videoId=ruleId.findall(url)
  12. return videoTitle[0],videoId[0]
  13. def getTrueLink(videoid):
  14. data=urllib.request.urlopen('http://v.youku.com/player/getPlayList/VideoIDS/'+videoid)
  15. info=json.loads(data.read().decode('utf8'))
  16. segs=info['data'][0]['segs']
  17. types=segs.keys()
  18. seed=info['data'][0]['seed']
  19. source=list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890")
  20. mixed=''
  21. while source:
  22. seed=(seed*211+30031)&0xFFFF
  23. index=seed*len(source)>>16
  24. c=source.pop(index)
  25. mixed+=c
  26. ids=info['data'][0]['streamfileids']['flv'].split('*')[:-1]
  27. vid=''.join(mixed[int(i)] for i in ids)
  28. sid='%s%s%s'%(int(time.time()*1000),random.randint(1000,1999),random.randint(1000,9999))
  29. urls=[]
  30. for s in segs['flv']:
  31. no='%02x'%int(s['no'])
  32. 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'])
  33. urls.append(url)
  34. return urls
  35. def down2file(urls,filename):
  36. f=open(filename,'wb')
  37. fileNum=len(urls)
  38. count=0
  39. for url in urls:
  40. count+=1
  41. print('downloading file %d/%d'%(count,fileNum))
  42. req=urllib.request.Request(url,headers={'Referer':'http://www.youku.com'})
  43. data=urllib.request.urlopen(req).read()
  44. f.write(data)
  45. f.close()
  46. print('download '+filename+' OK!')
  47. def youkuDown(link):
  48. videotitle,videoid=getVideoInfo(link)
  49. urls=getTrueLink(videoid)
  50. down2file(urls,videotitle+'.flv')
  51. if __name__=='__main__':
  52. if len(sys.argv)<2:
  53. print('Example Usage: python3 youkuDown.py http://v.youku.com/v_show/id_XNjUzNDQwMzIw.html')
  54. print('')
  55. exit()
  56. 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~~同时祝大家新年愉快~~哈哈哈

python3自动下载优酷视频小程序的更多相关文章

  1. 视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频

      视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频  2018-07-11 |  标签»下载, 下载工具, 视频 又是视频下载,老生常谈的话题.阿刚同学已在乐软博客多次与大家分享推荐 ...

  2. 鹅厂优文|打通小程序音视频和webRTC

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯视频云终端技术总监常青, 2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手机QQ.QQ物联 等产品 ...

  3. 网页中引用优酷视频去广告自动播放代码[xyytit]

    很多时候需要在网站中加入视频,可视频太大放自己服务器上太占空间,可以把视频上传到优酷网上,这样节省了空间,打开速度方面也会有不少提升.下面教大家如何引用自动播放的优酷视频.把下面的代码加在你网页适当位 ...

  4. JavaScript使用DeviceOne开发实战(四)仿优酷视频应用

    开发之前需要考虑系统的差异性,比如ios手机没有回退键,所以在开发时一定要考虑二级界面需要有回退键,否则ios的手机就会陷入到这个页面出不去了.安卓系统有回退键,针对这个情况需要要求用户在3秒钟之内连 ...

  5. php 获取优酷视频的真实地址(2014.6月新算法)

    上个礼拜发现优酷改版了,各种过滤优酷广告的插件都失效了,于是我百度了一下(谷歌也不能用了)发现优酷改算法了,在ckplayer论坛发现有人在6月25号发了个php 的优酷代理文件,下载下来发现,能用但 ...

  6. 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇)

    系列文章 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇) 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇) 前言 好久不见,很久没更新博客了,前段时间 ...

  7. 【API】获取优酷视频信息接口

    序:        自己的网站中需要接入一个视频模块,虚拟主机的空间小所以只能引用第三方的链接.感觉国内优酷好不错,所以查了一下优酷的接口. 0x00:        先去优酷API开放中心申请一个开 ...

  8. 使用Vitamio打造自己的Android万能播放器(5)——在线播放(播放优酷视频)

    前言 为了保证每周一篇的进度,又由于Vitamio新版本没有发布, 决定推迟本地播放的一些功能(截图.视频时间.尺寸等),跳过直接写在线播放部分的章节.从Vitamio的介绍可以看得出,其支持http ...

  9. 关于ubuntu14.04LTS 64位 播放优酷视频

    起因:chrome无法播放优酷视频,然后换firefox发现居然没有装flash 插件. 解释:关于chrome在网上看到了不少说法,说chrome新版本的不支持adobe flash之类的,但是这些 ...

随机推荐

  1. C++中运行外部程序

    关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项: [1]定义头文件 必须定义以下两个头文件: #include <shlobj.h& ...

  2. 关于tomcat配置MyEclipse项目的配置代码

    例如:<Context path="/shis" docBase="E:\Genuitec\Workspaces\MyEclipse 8.6\zwfw_platfo ...

  3. MyEclipse9,MyEclipse10 安装ADT

    Eclipse安装ADT 时步骤是开 Eclipse IDE,进入菜单中的 "Help" -> "Install New Software" ,点击Add ...

  4. 2016青岛网络赛 Barricade

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Proble ...

  5. 使用VNC远程管理VPS(Centos系统)

    首先安装桌面环境,我选择的是xfce,轻量级桌面,小巧实用不占太多内存,(占用内存方面,xfce<kde,kde<gnome). centos默认源里面没有xfce,首先安装epel源,然 ...

  6. 发布时去掉 debug 和 提醒日志,简单无侵入

    在 proguard 文件中加入下面代码,让发布时去掉 debug 和 提醒日志,简单无侵入! -assumenosideeffects class android.util.Log { public ...

  7. manecher

    #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> us ...

  8. stdarg.h头

    stdarg.h 头文件,主要目的是让函数可以接受可变参数. va_list :用来保存宏va_arg与宏va_end所需信息. va_start :使va_list指向起始的参数 va_arg :检 ...

  9. window下查看端口命令

    原文:http://blog.csdn.net/ldl22847/article/details/7181210 http://blog.csdn.net/xinxin19881112/article ...

  10. PAT (Advanced Level) 1017. Queueing at Bank (25)

    简单模拟. #include<iostream> #include<cstring> #include<cmath> #include<algorithm&g ...