如何使用Python脚本下载YouTube视频

如何使用Python脚本下载YouTube视频

在本教程中,我们将了解如何使用Python脚本下载YouTube视频。正如我们所知,Python拥有许多功能,其中包括丰富的模块和库。我们将使用一个流行的 pytube 库并编写Python脚本。

YouTube是一个非常流行的在线视频流媒体平台。有数百万个视频,涵盖了各种类别,例如教育、娱乐、旅行等。我们可以通过简单的点击轻松观看想要的视频,但下载视频却很困难。然而,在最近的更新中,YouTube允许我们将视频保存在其下载文件夹中以便离线播放。但我们无法将它们保存到本地。

有很多第三方网站可以获取视频并将其保存在本地计算机或手机上。我们可以使用Python简化这个过程。只需要几行代码,就可以轻松下载所需的视频。让我们看看如何在Python中实现pytube库。

pytube库

pytube是一个第三方的轻量级、Python风格的、无依赖的模块,用于下载YouTube视频。因此,它不是一个原生库,我们需要在使用之前先安装它。

在您的终端或命令提示符中键入以下命令。

命令

pip install pytube

按下回车键后,以上命令将把包下载到本地系统。

注意-我们建议您在虚拟环境中安装此库。

使用Pytube库下载单个视频

Pytube使下载YouTube视频变得非常简单。首先,我们从pytube模块中导入YouTube类。

from pytube import YouTube

现在我们通过将链接作为参数来创建YouTube类的对象。

video_url = 'https://youtu.be/2JBYnvUlAEc'
youtube_obj = YouTube(video_url)

这个 youtube_obj 从YouTube视频的URL中创建各种流。使用下面的代码,我们可以获取所有的流信息。

for stream in youtube_obj.streams:
    print(stream)

然后获取视频的适当扩展名和分辨率。在这之后,我们将使用 download() 方法,该方法接受一个参数,即文件下载位置。

mp4files = youtube_obj.streams.filter('mp4')
youtube_obj.set_filename('Downloaded Video')
d_video = youtube_obj.get(mp4files[-1].extension,mp4files[-1].resolution)

我们可以根据我们的适应性提供文件;原始名称将保留在另一个案例中。

现在实现完整的代码。让我们理解下面的代码。

示例

# importing the module
from pytube import YouTube
# download location of the file
DOWNLOAD_PATH = " C:/Users/USER/Desktop/" 
# link of the video to be downloaded
link="https://youtu.be/oQdxL_WW3aE"
try:
    # creating youtube object using YouTube
    youtube_obj = YouTube(link)
except:
    print("Connection Error") #to handle exception
# filters out all the files with "mp4" extension
mp4files = youtube_obj.streams.filter('mp4')
#to set the name of the file
youtube_obj.set_filename('Downloaded Video')
# get the video with the extension and
# resolution passed in the get() function
d_video = youtube_obj.get(mp4files[-1].extension,mp4files[-1].resolution)
try:
    # downloading the video
    d_video.download(DOWNLOAD_PATH)
except:
    print("The is Some Error!")
print('Task is Completed!')

输出:

Task is Completed    

以上代码将花费一些时间从网络上下载文件,因为有大量数据需要下载。连接速度也取决于下载速度。我们还可以下载多个视频。

获取视频标题

我们可以使用以下代码获取要下载的视频的标题。

yt = YouTube('https://youtu.be/oQdxL_WW3aE')
print(yt.title)

输出:

Shamshera | Date Announcement Teaser | Ranbir Kapoor, Sanjay Dutt, Vaani Kapoor | In Cinemas 22 July 

并且按照我们得到缩略图URL的方式。

yt = YouTube('https://youtu.be/oQdxL_WW3aE')
print(yt.thumbnail_url)

输出:

https://i.ytimg.com/vi/oQdxL_WW3aE/sddefault.jpg    

创建YouTube对象的高级方法

在pytube编程中,YouTube对象是继续前进的关键。之前我们讨论了如何创建一个简单的对象,现在我们将继续创建一个具有更多属性的YouTube对象。让我们看下面的示例。

示例:

yt = YouTube(
        'https://youtu.be/oQdxL_WW3aE',
         on_progress_callback=progress_func,
        on_complete_callback=complete_func,
        proxies=my_proxies,
        use_oauth=False,
        allow_oauth_cache=True
    )

属性 –

  • on_process_callback – 此函数用于从视频中下载块,它需要三个参数:数据块和视频中剩余的字节数。
  • on_complete_callback – 当视频完全下载时,此函数将执行。它可以用于下载后的操作,例如修剪视频的长度。它需要两个参数 – 流和文件路径。
  • use_oauth 和 allow_oauth_cache – 这允许我们授权 pytube 与 YouTube 用户账户进行交互。它还可以用于绕过年龄限制。

字幕/字幕轨道

Pytube 提供了获取可用字幕的功能。让我们来看下面的代码片段。

示例

yt = YouTube('http://youtube.com/watch?v=2lAe1cqCOXo')  
yt.captions

输出:

{'ar': <Caption lang="Arabic" code="ar">, 'zh-HK': <Caption lang="Chinese (Hong Kong)" code="zh-HK">, 'zh-TW': <Caption lang="Chinese (Taiwan)" code="zh-TW">, 'hr': <Caption lang="Croatian" code="hr">, 'cs': <Caption lang="Czech" code="cs">, 'da': <Caption lang="Danish" code="da">, 'nl': <Caption lang="Dutch" code="nl">, 'en': <Caption lang="English" code="en">, 'en-GB': <Caption lang="English (United Kingdom)" code="en-GB">, 'et': <Caption lang="Estonian" code="et">, 'fil': <Caption lang="Filipino" code="fil">, 'fi': <Caption lang="Finnish" code="fi">, 'fr-CA': <Caption lang="French (Canada)" code="fr-CA">, 'fr-FR': <Caption lang="French (France)" code="fr-FR">, 'de': <Caption lang="German" code="de">, 'el': <Caption lang="Greek" code="el">, 'iw': <Caption lang="Hebrew" code="iw">, 'hu': <Caption lang="Hungarian" code="hu">, 'id': <Caption lang="Indonesian" code="id">, 'it': <Caption lang="Italian" code="it">, 'ja': <Caption lang="Japanese" code="ja">, 'ko': <Caption lang="Korean" code="ko">, 'lv': <Caption lang="Latvian" code="lv">, 'lt': <Caption lang="Lithuanian" code="lt">, 'ms': <Caption lang="Malay" code="ms">, 'no': <Caption lang="Norwegian" 
code="no">, 'pl': <Caption lang="Polish" code="pl">, 'pt-BR': <Caption lang="Portuguese (Brazil)" code="pt-BR">, 'pt-PT': <Caption lang="Portuguese (Portugal)" code="pt-PT">, 'ro': <Caption lang="Romanian" code="ro">, 'ru': <Caption lang="Russian" code="ru">, 'sk': <Caption lang="Slovak" code="sk">, 'es-419': <Caption lang="Spanish (Latin America)" code="es-419">, 'es-ES': <Caption lang="Spanish (Spain)" code="es-ES">, 'sv': <Caption 
lang="Swedish" code="sv">, 'th': <Caption lang="Thai" code="th">, 'tr': <Caption lang="Turkish" code="tr">, 'uk': <Caption lang="Ukrainian" code="uk">, 'ur': <Caption lang="Urdu" code="ur">, 'vi': <Caption lang="Vietnamese" code="vi">}

现在,我们将获取英文字幕。

caption = yt.captions.get_by_language_code('en')

输出:

<stdin>:1: DeprecationWarning: Call to deprecated function get_by_language_code (This object can be treated as a dictionary, i.e. captions['en']).

让我们来看一下字幕的格式。

caption.xml_captions

输出:

<?xml version="1.0" encoding="utf-8" ?><timedtext format="3">\n<body>\n<p t="10200" d="940">K-pop!</p>\n<p t="13400" d="2800">That is so awkward 
to watch.</p>\n<p t="16200" d="2080">YouTube Rewind 2018.</p>\n<p t="18480" d="3520">The most disliked video\nin the history of YouTube.</p>\n<p t="22780" d="2220">In 2018, we made something\nyou didn?t like.</p>\n<p t="25100" d="2470">So in 2019, let?s see what\nyou DID like.</p>\n<p t="27580" d="1400">Because you?re better at this\nthan we are.</p>\n<p t="45110" d="1310">This is my outfit!</p>\n<p t="46920" d="1240">What is it gonna be?</p>\n<p t="58180" d="1370">You made these the</p>\n<p t="59710" d="1680">MOST LIKED CREATOR VIDEOS\n*of 2019, duh?</p>\n<p t="62480" d="1700">Shane Dawson | Conspiracy Theories with Shane Dawson\n1.9M</p>\n<p t="65000" d="2690">A4 | ??????? ??? ??? ?? ?????? ?????? ?? ???????? !\n2M</p>\n<p t="67690" d="2750">Andymation | My BIGGEST Flipbook EVER\n2.3M</p>\n<p t="70930" d="1730">James Charles | No More Lies\n2.4M</p>\n<p t="73070" d="2030">SethEverman | how to create billie eilish?s ?bad guy?\n2.8M</p>\n<p t="76010" d="2300">Nilson Izaias Papinho Oficial | Minha slime deu 
certo\n2.8M</p>\n<p t="79290" d="2540">Black Gryph0n | ONE GUY, 54 VOICES\n3.4M</p>\n<p t="82650" d="2380">whinderssonnunes | O DIA EM QUE ASSISTI BIRD BOX\n3.4M</p>\n<p t="86290" d="2630">PewDiePie | Marzia & Felix - Wedding\n4.7M</p>\n<p t="89890" d="3530">MrBeast | Make This Video the Most Liked Video On YouTube\n10.9M</p>\n<p t="99150" d="2410">The MOST LIKED\nMUSIC VIDEOS</p>??.

我们采用了样本输出,因此它包含许多以特定格式排列的行。

下载多个视频

这与下载单个视频的过程相同。我们可以创建一个包含多个URL的列表,并使用for循环进行迭代。让我们来了解以下示例。

示例

from pytube import YouTube
#where to save
DOWNLOAD_PATH = "D:/Users/User/NewFolder" #to_do
#List of links of the video to be downloaded
video_link=["https://www.youtube.com/watch?v=xWOoBJUqlbI",
    "https://www.youtube.com/watch?v=xWOoBJUqlbI"
    ]
for i in video_link:
    try:
        yt = YouTube(i)
    except:       
        #to handle exception
        print("Connection Error")
    mp4files = yt.filter('mp4')
    d_video = yt.get(mp4files[-1].extension,mp4files[-1].resolution)
    try:
        # downloading the video
        d_video.download(DOWNLOAD_PATH)
    except:
        print("There is some Error!")
print('Videos Download Successfully!')

循环将逐个选择一个链接,并传递给YouTube类以创建一个对象。我们在get()函数中传递了一个分辨率,并将其保存在所需位置。然后,我们过滤掉所有具有mp4扩展名的文件。

Python搜索功能

Pytube允许我们执行与YouTube上搜索栏中相同的搜索功能。它可以提供可以检查和下载的YouTube对象,而不需要进行额外的处理。让我们理解以下示例。

示例

from pytube import Search
s = Search('Cricket World Cup')
s.results      

输出:

[<pytube.__main__.YouTube object: videoId=AFEZzf9_EHk>, <pytube.__main__.YouTube object: videoId=_PNIlJry8vA>, <pytube.__main__.YouTube object: videoId=MFI-r7_xH-Y>, <pytube.__main__.YouTube object: videoId=mEOBGY4-7JA>, <pytube.__main__.YouTube object: videoId=n7xSITvP4D4>, <pytube.__main__.YouTube object: videoId=A5OU6YP3Jm4>, <pytube.__main__.YouTube object: videoId=Kwu1yIC-ssg>, <pytube.__main__.YouTube object: videoId=lA2Ojyb0gqg>, <pytube.__main__.YouTube object: videoId=gkWHGy70jIg>, <pytube.__main__.YouTube object: videoId=amMJfaB5dXo>, <pytube.__main__.YouTube object: 
videoId=rl3L2SGgmNo>, <pytube.__main__.YouTube object: videoId=AVbfs0-509k>, <pytube.__main__.YouTube object: videoId=Wi2oqXS6SlY>, <pytube.__main__.YouTube object: videoId=HNXhdo5j914>, <pytube.__main__.YouTube object: videoId=gmVj3yOdOFo>, <pytube.__main__.YouTube object: videoId=WUODHf0IT5U>, <pytube.__main__.YouTube object: videoId=mUniRe7tysE>, <pytube.__main__.YouTube object: videoId=ynG6tkLO3SQ>]

搜索还有关联的自动完成建议。可以在下面访问这些建议。

s.completion_suggestions

输出:

['2000 world cup final', '1999 world cup final', '2003 world cup final', '1996 world cup india vs pakistan', 'india vs pakistan champions trophy 2017 highlights', 'india vs australia 2011 world cup highlights', 'icc world cup 2021', 'icc world cup 2019 song', 't20 world cup 2016 final']   

需要记住的要点

  • 要下载视频,必须有适当的互联网连接,否则会出错。
  • 我们可以使用另一个名称数组来更改文件名。
  • 不良的互联网连接会停止下载并引发错误。

结论

在本教程中,我们介绍了pytube库及其用例。这是一种在不访问任何网站的情况下下载YouTube视频的最佳方式。视频下载网站可能需要很长时间,并显示许多无关的广告。使用几行代码,我们可以在Python中下载单个或多个视频而不受任何干扰。但是,如果您有适当的互联网连接,效果会更好。这个库还包含许多高级功能,但我们已经提到了所有重要的功能。如果您想阅读有关pytube库的更多信息,可以访问其官方的写得很好的文档。pytube库。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程