YouTube-dl下载视频

下载播放列表里的视频必须要获得播放列表的链接,因为youtube比较容易获得播放列表的链接,所以这一节以下载youtube上的播放列表为例。

如果要下载整个播放列表,那么给视频链接时给整个播放列表的地址,比如调用下载函数ydl.download([播放列表的链接])。也可以给播放列表中的一个视频的地址,默认情况下会下载整个播放列表,之后把这个视频再下载一遍。除非特别设置参数noplaylist:

     ydl_opts = {
                'outtmpl': destPath+'%(title)s.%(ext)s',                            
                'noplaylist': True.   # ydl.download([视频链接])的视频链接从播放列表中的视频地址获取,默认会下载整个播放列表,noplaylist为True时不下载列表,只下载视频
                }

参数playliststart可以设定从播放列表的第几个视频开始下载:

ydl_opts = {
               ……                     
               'playliststart': 46,         # 列表中第46个视频开始下载
               ……
           }

参数playlistend可以设定下载到播放列表的第几个视频:

            'playliststart': 18,                 

             # 下载列表中的第1到第18视频

参数playlist_items设定播放列表内的精准下载:

            'playlist_items': '3-6',             # 播放列表的第3到第6视频

            或

            'playlist_items': '3,6',             # 播放列表的第3和第6视频

            或

            'playlist_items': '3-6,12',        # 播放列表的第3到第6视频,以及第12视频

参数playlistreverse指定逆序(从后往前)下载,参数playlistrandom按随机顺序下载。也可以通过参数matchtitle下载指定标题的视频:

ydl_opts = {           
            'outtmpl': destPath+'%(title)s.%(ext)s',
            'noplaylist': True     # 如果不设置参数noplaylist为True,则会下载整个播放列表后再下载指定标题的视频             
            'matchtitle': '78 excel单元格公式计算'.  # 下载播放列表中标题为'78 excel单元格公式计算'的视频

            }

下载视频的对象ydl除了有下载视频的方法函数download(),还有个方法函数extract_info()可以获取下载视频或播放列表的信息。如果只获得所下载的视频/播放列表的信息,而不真正去下载视频:

# 下载对象的方法函数extract_info()返回一个字典放进result
result = ydl.extract_info(   
               videoPage,          # 视频链接
               download=False,     # 不下载只是抽取信息                   
                          )

如果既要获取视频信息又要下载视频,那么就把参数download=False拿掉:

result = ydl.extract_info(videoPage)   # 获取信息并且下载,返回一个字典

通过是否有关键字entries

if 'entries' in result:
    ……

可以判断出result里存放的是播放列表还是单个视频的信息。如果是单个视频,那么result这个字典里就是这个视频的信息,通过关键字title可获得视频的标题,ext可获得视频的扩展名……;如果是播放列表,那么result这个字典获得的是播放列表的信息。通过关键字entries获得视频序列,配合索引可以访问到每个视频的信息。下面的代码根据下载的是单个视频还是多个视频做出不同输出:

# 只用youtube-dl获取视频信息,不下载视频;若想获取视频信息的同时也下载视频,只需要在调用抽取信息函数时把download=False拿掉:result = ydl.extract_info(videoPage)

import youtube_dl
import pprint

destPath = '/Users/PythonABC/Documents/tmp/'     # 音频文件存放的目标字串

# 播放列表的链接
videoPage =  'https://www.youtube.com/playlist?list=PLhbhqgpAIh2mJr01xkPJeZplfPDUgnbCz'

# 如果链接是youtube上播放列表的某一个视频链接,比如videoPage = 'https://www.youtube.com/watch?v=llypXlgzgUc&list=PLhbhqgpAIh2mJr01xkPJeZplfPDUgnbCz&index=78&t=0s',则会下载播放列表中的视频和这里指定的视频(放在最后)。如果是bilibili上播放列表上的某个视频链接,则只是下载这个视频而已

ydl_opts = {
            'outtmpl': destPath+'%(title)s.%(ext)s',
            # 'quiet': True,            # 这个参数为真则不输出提示信息
            'playlist_items': '3,6',    # 指定播放列表的第3和第6视频
            }
ydl = youtube_dl.YoutubeDL(ydl_opts)

result = ydl.extract_info(              # result存放获取的信息
                    videoPage,          # 视频链接或播放列表链接
                    download=False,     # 不下载只是抽取信息
                         )

if 'entries' in result:                # 为真说明是播放列表或一系列视频
    downloadVideos = result['entries']  # downloadVideos获得视频列表
    print('提取了如下视频信息:')
    for video in downloadVideos:       # 循环变量video遍历视频列表
        print('=================================================')
        print("标题:{}\n扩展名:{}\nid:{}\n网址:{}".format(video['title'], video['ext'], video['id'], video['webpage_url']))
        # 输出指定视频信息
else:                         # 说明是一个视频
    downloadVideo = result
    print('====================================================')
    print('一枝独秀:{}.{}'.format(downloadVideo['title'], downloadVideo['ext']))      # 输出这个视频的视频信息

 变量videoPage接收的是一个播放列表的链接或播放列表一个视频的链接,运行结果为:

下载播放列表里的第3和第6个视频

在ydl_opts中,如果设定参数quiet为True,则运行结果为:

quite为True则不输出下载提示信息

变量videoPage接收的是一个视频链接的运行结果为:

下载一个视频的输出