使用 Python 将 YouTube 视频下载到某个目录

Posted

技术标签:

【中文标题】使用 Python 将 YouTube 视频下载到某个目录【英文标题】:Download YouTube video using Python to a certain directory 【发布时间】:2017-04-04 10:34:35 【问题描述】:

我已尝试使用以下代码在 YouTube 中下载视频并且它可以正常工作,但我想将视频保存在特定位置。现在它将视频保存在C:/Users/Download。如果我想将视频保存在桌面,我需要在代码中进行哪些更改?

from __future__ import unicode_literals
import youtube_dl
import urllib
import shutil
ydl_opts = 
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=n06H7OcPd-g'])

【问题讨论】:

其实这个问题的答案是在命令行中添加-o选项来设置你的输出文件,参考GitHub example。 只需在ydl_opts中设置'outtmpl':***.com/questions/35643757/… 【参考方案1】:

自从最初发布该问题的最佳答案以来,pytube 似乎发生了一些变化。以下是使用 PyTube v11.0.2(2022 年 1 月 9 日)的更新示例:

'''
HOW TO: Download YouTube Videos Programmatically with Python & pytube

$ pip install pytube

$ python3 download.py
'''

from pytube import YouTube

def on_progress(stream, chunk, bytes_remaining):
    print("Downloading...")

def on_complete(stream, file_path):
    print("Download Complete")

yt = YouTube(
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        on_progress_callback=on_progress,
        on_complete_callback=on_complete,
        use_oauth=False,
        allow_oauth_cache=True
    )

yt.streams.filter(file_extension='mp4', res="720p").first().download()

【讨论】:

【参考方案2】:

我发现了一个非常酷的 python 模块,它可以让你轻松地从 youtube 下载视频。安装它:

pip install pytube

现在,你可以像这样下载你的视频了 -

from pytube import YouTube
yt = YouTube("https://www.youtube.com/watch?v=n06H7OcPd-g")
yt = yt.get('mp4', '720p')
yt.download('/path/to/download/directory')

Boom,现在您可以轻松地使用 Python 轻松抓取此类视频;现在,我们喝酒!

更新 1:

感谢@Chiramisu 的评论,您可以使用以下单线下载最高质量的视频:

YouTube('video_url').streams.first().download('save_path')

对于 Windows,请使用双反斜杠指定路径,例如:

YouTube('video_url').streams.first().download('C:\\Users\\username\\save_path')

更新 2:

如果 pytube 似乎不适合您,请尝试使用 youtube-dl:

pip install --upgrade youtube-dl

现在下载视频:

from __future__ import unicode_literals
import youtube_dl

ydl_opts = 
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])

更多关于 ytdl 的信息在 python here.

【讨论】:

我不明白视频变量/对象来自哪里? AttributeError: 'YouTube' object has no attribute 'get' 单线 updated logic: YouTube('video_url').streams.first().download('save_path')。这将下载最高质量的视频,但 1080p 或更高版本将是视频和音频的单独文件,需要与 FFmpeg 或一些此类实用程序结合。 @mLstudent33 检查我的回答中的 udpate 2 YouTube('video_url').streams.first() 没有给我最高分辨率。我用yt.streams.filter(res="1080p").first().download()解决了它【参考方案3】:

我创建了一个使其更简单的库。

安装:

$ pip install mhyt
# or
$ sudo pip install mhyt

并像这样使用它:

from mhyt import yt_download

yt_download("url","file.format","format"ismucic=True)

【讨论】:

【参考方案4】:
from __future__ import unicode_literals
import youtube_dl

ydl_opts = 
    'outtmpl': 'yourPathToDirectory/%(title)s.%(ext)s',



with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=XpYGgtrMTYs'])

ydl_opts 是我们需要玩的。我们可以在其中声明多个属性/参数以进行自定义。对于此示例,我添加了一个属性 outtmpl,用于定义自定义目录。我们可以进一步自定义这个来声明文件名

【讨论】:

【参考方案5】:

-> 卸载 pytube(如果存在)

pip uninstall pytube

-> 安装:

pip install pytube3

-> 修改环境中的 extract.py:

lib/pytube/extract.py

-> 查找和编辑行:

parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)

-> 改为:

parse_qs(formats[i]["signatureCipher"]) for i, data in enumerate(formats)

-> 使用 pytube:

from pytube import YouTube
import os


def downloadYoutube(vid_url, path):
    yt = YouTube(vid_url)
    yt = yt.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()
    if not os.path.exists(path):
        os.makedirs(path)

    yt.download(path)

url = input('Input url:\n')
path = input('Path to store file:\n')
downloadYoutube(url, path)

【讨论】:

【参考方案6】:

你应该把它放在ydl_opts

ydl_opts = 
    'outtmpl': os.path.join(download_path, '%(title)s-%(id)s.%(ext)s'),

在您的情况下,download_path 应该是 'C:/Users/Desktop'。如果您喜欢不带视频 ID 的文件名,请使用 %(title)s.%(ext)s 而不是 %(title)s-%(id)s.%(ext)s

或者您也可以os.chdir(path) 在开始下载之前将目录更改为您希望下载的位置。

from __future__ import unicode_literals
import youtube_dl
import os

ydl_opts = 
os.chdir('C:/Users/Desktop')
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=n06H7OcPd-g'])

【讨论】:

如果我想将文件保存在谷歌云存储上,我仍然可以使用os.chdir定义路径,以便下载的视频可以保存在gcs中。 您可以在文件资源管理器/Finder 中访问 gcs 吗?如果是这样,可能是的。我可以将文件直接保存在我的谷歌驱动器中,该驱动器作为卷安装在我的 Mac 上。 正是我想要的。其余的答案过于关注其他软件包,而 OP 明确提到了 youtube-dl。【参考方案7】:
Path = "The Path That You Want"
Location = '%s \%(extractor)s-%(id)s-%(title)s.%(ext)s'.replace("%s ", Path)
ytdl_format_options = 
'outtmpl': Location


with youtube_dl.YoutubeDL(ytdl_format_options) as ydl:
     ydl.download(['https://www.youtube.com/watch?v=n06H7OcPd-g'])

我个人不太了解该库,但据我所知,youtube_dl 有 ytdl_format_options 它为您提供了添加一些我不知道它叫什么的选项,但让我们说像上面 outtmp1 这样的参数给您选项指定位置、ID、标题或安静是否查看日志,还有更多。几乎所有你可以从这个 URL 获得它:https://github.com/ytdl-org/youtube-dl/blob/master/README.md#format-selection

【讨论】:

请说明您发布的代码。【参考方案8】:

在 python 3.x 中从 youtube 下载视频 作为参考,您可以查看https://python-pytube.readthedocs.io/en/latest/user/quickstart.html#downloading-a-video

from pytube import YouTube
import os

def downloadYouTube(videourl, path):

    yt = YouTube(videourl)
    yt = yt.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()
    if not os.path.exists(path):
        os.makedirs(path)
    yt.download(path)

downloadYouTube('https://www.youtube.com/watch?v=zNyYDHCg06c', './videos/FindingNemo1')

【讨论】:

我认为您的代码可能没问题,但我收到了 KeyError: s,这似乎是 github 上的一个未解决问题。【参考方案9】:

它将保存文件您的 .py 应用程序所在的位置。例如,如果您的 .py 程序位于桌面文件夹中,并且您从桌面运行应用程序,则输出将保存在您的桌面上。您唯一需要做的就是将 .py 文件保存在 Desktop 中,然后在使用 python YOURAPP.py 运行 .py 文件后打开命令行并使用 cd 命令进入 Desktop 但是如果你想下载它然后将它保存在另一个地方,你需要像现在一样下载它(在你的临时位置),然后通过 python 中的文件库移动它

【讨论】:

【参考方案10】:

我猜你有点糊涂了,试试这段代码,端到端

    from __future__ import unicode_literals
    import youtube_dl
    import urllib
    import shutil
    ydl_opts = 
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download(['https://www.youtube.com/watch?v=n06H7OcPd-g'])

    #Moving your source file to destination folder
    source_file = 'C:\Users\Sharmili Nag\Aahatein - Agnee (splitsvilla 4 theme song) Best audio quality-n06H7OcPd-g.mp4'
    destination_folder = 'C:\Users\Sharmili Nag\Desktop\Aahatein - Agnee (splitsvilla 4 theme song) Best audio quality-n06H7OcPd-g.mp4'
    shutil.move(source_file, destination_folder)

如果此代码适合您,请将答案标记为正确。

【讨论】:

【参考方案11】:

youtube_dl 有一个巨大的选项列表:https://github.com/rg3/youtube-dl/blob/master/youtube_dl/YoutubeDL.py#L128-L278

但是我没有看到任何控制输出目录的东西。因此,您可以在之后移动文件。为此,请参阅:How to move a file in Python。

【讨论】:

我试过下面的代码 source = 'C:\Users\Sharmili Nag\Aahatein - Aghee (splitsvilla 4 主题曲) Best audio quality-n06H7OcPd-g.mp4' destination = 'C:\ Users\Sharmili Nag\Desktop' import os os.rename(source,destination) 但我收到此错误 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

以上是关于使用 Python 将 YouTube 视频下载到某个目录的主要内容,如果未能解决你的问题,请参考以下文章

Python:使用谷歌提供的代码段将视频上传到 youtube 不起作用

Python:使用Google提供的代码段将视频上传到youtube不起作用

将 pi 的 opencv 视频传输到 ffmpeg 以进行 Youtube 流式传输

使用url从python流传输youtube音频而无需下载python

如何使用 C# 中的 Youtube API 将视频上传到 YouTube?

Python下载具有特定文件名的youtube