youtube-dl是一个命令行程序,用于从YouTube.com和更多网站下载视频。它需要Python解释器,版本2.6,2.7或3.2+,并且支持Unix,Windows或Mac OS X中运行。而且它提供了自定义添加视频解释并发布到github上,这意味着可以对其进行修改,重新分发。

ubuntu系统安装youtube-dl

sudo pip install youtube-dl

更新包

sudo -H pip install --upgrade youtube-dl

或者

pip install --upgrade youtube-dl

youtube-dl在大多数网站上都可以正常工作。但是,如果您想转换视频/音频,视频音频合成,则需要avconv或ffmpeg

添加软件源

$ sudo add-apt-repository ppa:jonathonf/ffmpeg-3

更新并安装

$ sudo apt update && sudo apt install ffmpeg libav-tools x264 x265

卸载官方源的2.8版本

$ sudo apt autoremove

先来一段简单的python脚本代码

  1. from os import rename
  2. import youtube_dl
  3. def download(youtube_url):
  4. # 定义某些下载参数
  5. ydl_opts = {
  6. # outtmpl 格式化下载后的文件名,避免默认文件名太长无法保存
  7. 'outtmpl': '%(id)s%(ext)s'
  8. }
  9. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  10. ydl.download([youtube_url])
  11. if __name__ == '__main__':
  12. download('https://www.youtube.com/watch?v=VUOAszEiR8I')

代码执行youtube网站视频页链接,交给dowload下载,字典 ydl_opts 自定义了一些下载参数。

重命名视频文件

当你运行代码后,发现下载的视频文件命名不是你想要的样子,这里了 youtube-dl 提供了一个钩子函数进行自定义功能,代码是这样的:

  1. class GetItem(object):
  2. def rename_hook(self,d):
  3. # 重命名下载的视频名称的钩子
  4. if d['status'] == 'finished':
  5. file_name = 'video/{}.mp4'.format(int(time.time()))
  6. rename(d['filename'], file_name)
  7. print('下载完成{}'.format(file_name))
  8. def download(self,youtube_url):
  9. # 定义某些下载参数
  10. ydl_opts = {
  11. 'progress_hooks': [self.rename_hook],
  12. # 格式化下载后的文件名,避免默认文件名太长无法保存
  13. 'outtmpl': '%(id)s%(ext)s',
  14. }
  15. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  16. # 下载给定的URL列表
  17. result = ydl.download([youtube_url])
  18. if __name__ == '__main__':
  19. getItem = GetItem()
  20. getItem.download('https://www.youtube.com/watch?v=VUOAszEiR8I')

代码 d[‘status’] == ‘finished’执行,说明了当视频下载完成后,执行重命名文件名

自定义下载格式

在定义下载下载参数时可以写入format:”格式” 来控制下载的格式,youtube-dl给到了以下这些默认的格式

  1. best:选择具有视频和音频的单个文件所代表的最佳质量格式。
  2. worst:选择具有视频和音频的单个文件所代表的最差质量格式。
  3. bestvideo:选择最佳质量的仅视频格式(例如DASH视频)。可能无法使用。
  4. worstvideo:选择质量最差的纯视频格式。可能无法使用。
  5. bestaudio:选择质量最佳的音频格式。可能无法使用。
  6. worstaudio:选择质量最差的音频格式。可能无法使用。

我们也可以通过视频原有的格式来下载

在终端输入 : youtube-dl -F 视频地址

shell 命令查看参数

shell 命令查看参数

可以看到有h5 ,1,h3 三种格式,所以代码可以这样写:

  1. class GetItem(object):
  2. def rename_hook(self,d):
  3. # 重命名下载的视频名称的钩子
  4. if d['status'] == 'finished':
  5. file_name = 'video/{}.mp4'.format(int(time.time()))
  6. rename(d['filename'], file_name)
  7. print('下载完成{}'.format(file_name))
  8. def download(self,youtube_url):
  9. # 定义某些下载参数
  10. ydl_opts = {
  11. # 我指定了要下载 “1” 这个格式,也可以填写 best/worst/worstaudio 等等
  12. 'format' : '1'
  13. 'progress_hooks': [self.rename_hook],
  14. # 格式化下载后的文件名,避免默认文件名太长无法保存
  15. 'outtmpl': '%(id)s%(ext)s',
  16. }
  17. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  18. # 下载给定的URL列表
  19. result = ydl.download([youtube_url])
  20. if __name__ == '__main__':
  21. getItem = GetItem()
  22. getItem.download('https://www.youtube.com/watch?v=VUOAszEiR8I')

日志打印

如果要打印youtube-dl的输出logs,请设置一个logger对象。 同自定义格式一样,配置参数’logger’: MyLogger(),如下:

  1. class MyLogger(object):
  2. def debug(self, msg):
  3. pass
  4. def warning(self, msg):
  5. pass
  6. def error(self, msg):
  7. print(msg)
  8. class GetItem(object):
  9. def rename_hook(self,d):
  10. # 重命名下载的视频名称的钩子
  11. if d['status'] == 'finished':
  12. file_name = 'video/{}.mp4'.format(int(time.time()))
  13. rename(d['filename'], file_name)
  14. print('下载完成{}'.format(file_name))
  15. def download(self,youtube_url):
  16. # 定义某些下载参数
  17. ydl_opts = {
  18. # 我指定了要下载 “1” 这个格式,也可以填写 best/worst/worstaudio 等等
  19. 'format' : '1'
  20. 'progress_hooks': [self.rename_hook],
  21. # 格式化下载后的文件名,避免默认文件名太长无法保存
  22. 'outtmpl': '%(id)s%(ext)s',
  23. # 打印日志
  24. 'logger': MyLogger()
  25. }
  26. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  27. # 下载给定的URL列表
  28. result = ydl.download([youtube_url])
  29. if __name__ == '__main__':
  30. getItem = GetItem()
  31. getItem.download('https://www.youtube.com/watch?v=VUOAszEiR8I')

提取视频的json信息打印

现在有一个需求是:不需要下载视频,我想要得到当前页视频网站的数据,可以用 extract_info 不用 download 去下载

  1. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  2. # extract_info 提取信息
  3. result = ydl.extract_info(youtube_url, download=False)
  4. print(result)

合并音频+视频

可以先用youtube-dl -F “视频地址”查看format信息,在选择对应的格式代号如(’format’: ‘134+m4a’,)合成,但是合成视频音频是必须先安装ffmpeg,文章开头已经介绍过,不然会报错如下:

  1. WARNING: You have requested multiple formats but ffmpeg or avconv are not installed. The formats wont be merged.
  1. import youtube_dl
  2. def download(url):
  3. ydl_opts = {
  4. 'format': '134+m4a',
  5. 'outtmpl': '%(id)s%(ext)s'
  6. }
  7. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  8. result = ydl.extract_info(url, download=True)
  9. if __name__ == '__main__':
  10. download('https://www.youtube.com/watch?v=-5r9oswhnY4')

转至

http://www.yujzw.com/python/python-youtube-dl.html

【转】python调用youtube-dl实现视频下载的更多相关文章

  1. 手把手教你用python打造网易公开课视频下载软件2-编码相关说明

    函数getdownLoadInfo(url)主要实现核心功能:根据url地址,获取课程信息:课程名(courseTitle),课程数目(courseCount),可下载视频数目(videoCount) ...

  2. 手把手教你用python打造网易公开课视频下载软件1-总述

    写作前面的话:最近准备重温一下算法导论,感谢大网易把MIT算法导论课程全部贴出来,地址为:http://v.163.com/special/opencourse/algorithms.html,在线看 ...

  3. 手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理

    上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标 ...

  4. 手把手教你用python打造网易公开课视频下载软件4-图形化界面

    上一篇讲解完函数:def getdownLoadInfo (url): 传入公开课的url地址,就可以提取课程的信息,这一篇讲解一下如何编写图像化界面.大概思考一下图像化界面需要的内容: (1)一个标 ...

  5. 手把手教你用python打造网易公开课视频下载软件5-python生成exe程序

    python程序生成exe文件,使用的是py2exe扩展包,下面写下具体的步骤: 第一步:新建conver2exe.py,内容如下: #coding:utf-8 from distutils.core ...

  6. python调用mediainfo工具批量提取视频信息

    写了2个脚本,分别是v1版本和v2版本 都是python调用mediainfo工具提取视频元数据信息 v1版本是使用pycharm中测试运行的,指定了视频路径 v2版本是最终交付给运营运行的,会把v2 ...

  7. Python: 调用youtube_dl实现视频下载

    研究PySide与youtube_dl结合实现视频下载,抽丝剥蚕,步步维艰,却也颇有意思. 记录初始心得.界面以PySide之Qt编写,调用youtube_dl下载,回调出下载进度,代码如下: # e ...

  8. Python:使用youtube-dl+ffmpeg+FQ软件下载youtube视频

    声明:本文所述内容都是从http://blog.csdn.net/u011475134/article/details/71023612博文中学习而来. 背景: 一同学想通过FQ软件下载一些youtu ...

  9. 用python做youtube自动化下载器 代码

    目录 项目地址 思路 流程 1. post i. 先把post中的headers格式化 ii.然后把参数也格式化 iii. 最后再执行requests库的post请求 iv. 封装成一个函数 2. 调 ...

随机推荐

  1. 大家是怎么做APP接口的版本控制的?欢迎进来看看我的方案。升级版的Versioning

    背景 APP不同于网站,网站程序一发版,所有用户看到的都是最新的页面.调用最新的接口,没有新老版本一说.APP一旦下载到用户手机上,用户不更新你拿他一点办法都没有,但是随着业务的调整,同一个接口的请求 ...

  2. 谈谈Hadoop MapReduce和Spark MR实现

    谈谈MapReduce的概念.Hadoop MapReduce和Spark基于MR的实现 什么是MapReduce? MapReduce是一种分布式海量数据处理的编程模型,用于大规模数据集的并行运算. ...

  3. Docker引言,由来,思想

    引言 我本地运行没问题啊? 环境不一致? 哪个哥们又写死循环了?,怎么这么卡? 在多用户操作系统下,会相互影响 淘宝在双11的时候,用户量暴增 运维成果过高的问题 学习一门技术,学习安装成本高 关于安 ...

  4. PHP timezone_name_from_abbr() 函数

    ------------恢复内容开始------------ 实例 根据时区缩略语返回时区名称: <?phpecho timezone_name_from_abbr("EST" ...

  5. PHP getNamespaces() 函数

    实例 返回 XML 文档中使用的命名空间: <?php$xml=<<<XML高佣联盟 www.cgewang.com<?xml version="1.0&quo ...

  6. PDOStatement::setAttribute

    PDOStatement::setAttribute — 设置一个语句属性(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)高佣联盟 www.cgewang.com 说 ...

  7. 数据库允许空值(null),往往是悲剧的开始

    原文: 58沈剑   架构师之路   https://mp.weixin.qq.com/s/XRSPITgWWK-2Ee-cSIqw1w 数据库字段允许空值,会遇到一些问题,此处包含的一些知识点,和大 ...

  8. RxJS 中的观察者和迭代器模式

    目录 前言 观察者模式 迭代器模式 RxJS 中两种模式的结合和实现 小结 参考 1. 前言 RxJS 是一个库,它通过使用observable(可观察对象)序列来编写异步和基于事件的程序.其结合了观 ...

  9. Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)

    Java web Cookie详解 啥是cookie? 查询有道词典得: web和饼干有啥关系? 这个谜底等等来为大家揭晓 会话技术 web中的会话技术类似于生活中两个人聊天,不过web中的会话指的是 ...

  10. 大学生可用来接单,利用Python实现教务系统扩容抢课!

    最近一学期一次的抢课大戏又来了,几家欢乐几家愁.O(∩_∩)O哈哈~(l我每次一选就过了hah,我还是有欧的时候滴).看着他们盯着教务系统就着急,何况我们那教务系统,不想说什么.emmm 想周围的朋友 ...