python3自动下载优酷视频小程序

时间:2021-01-31 06:33:50

我们一般都在优酷里看一些好玩的视频,有时候看到精彩的就想下载到本地保存起来留作纪念,在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里面,下载的时候会显示出共有几段以及实时下载了多少段。下面是我的使用举例:

python3自动下载优酷视频小程序

保存到本地的视频播放情况:

python3自动下载优酷视频小程序

在linux下想下载优酷视频的盆友们enjoy it~~同时祝大家新年愉快~~哈哈哈