发布于 2026-01-05 5 阅读
0

一次性下载整个 YouTube 播放列表 网络爬虫 YoPlaDo

一次性下载整个 YouTube 播放列表

网络爬虫

YoPlaDo

注:本文仅用于教育目的,展示网络爬虫的用途。

你有没有遇到过这种情况:期末考试还有一周左右就要开始了,而你却一节课都没认真听过(当然,我是指认真听讲的情况)?然后你求助于 YouTube 寻求帮助(我每次都这样),结果却得到了一个庞大的播放列表(甚至比 node_modules 还大),而你那里的流量/网速又有限。

或者,你想从 YouTube 学习一项新技能/语言/框架,你找到了一个不错的“播放列表”,但你的手机存储空间有限。

现在有一些网站/应用可以下载 YouTube 视频。
哎呀,它们要么一次下载一个视频,要么一次性下载整个播放列表,但这些都是收费的。你可以一个一个地下载播放列表(除非列表太大)。考试很重要,你可以付费参加,如果是为了学习,那就多花点时间吧,我们有的是时间。

开发人员

等等,你是一位 Python 开发者。为什么要花钱购买一个只需几行代码就能实现的服务呢?
本文将介绍一个使用 Python 构建的简单项目“YoPlaDo - YouTube 播放列表下载器”。我们将编写一个程序,它接收 YouTube 播放列表链接,使用 Selenium 抓取所有视频链接,然后使用 YouTube-dl 下载视频。

网络爬虫

你有没有搜索并下载过图片?或者用过Ctrl+ C和Ctrl+ V复制粘贴(懂的都懂)?或者提交过直接用网上找到的答案的作业?基本上,这就是网络爬虫。

刮擦

收集数据,更准确地说是从网站提取数据,就是网络爬虫。与其手动操作,不如让一切自动化。这就是网络爬虫的作用。你只需给它一个待提取内容的列表,它就会从网站中抓取数据。
例如,如果你需要一张图片,它会搜索 img 标签。
如今,网络爬虫的应用已遍及各个领域,从数字营销到数据科学和人工智能,无所不包。

因此,各种编程语言都提供了各种库、框架和工具来创建网络爬虫或网页抓取器。Python 使用了 Selenium、Beautiful Soup、Scrapy 等工具。

在此,我们将使用 Selenium 创建一个基本的动态网站项目。

开发人员

YoPlaDo

“Selenium 是一个用于测试 Web 应用程序的可移植框架。” - 维基百科

它主要用于自动化 Web 应用程序的测试,但用途远不止于此。
枯燥乏味的 Web 管理任务也可以(而且应该)实现自动化。
我会用更简单的方式进行解释。如需了解详细信息,请参阅文档

Youtube-dl

“用于从 YouTube.com 和其他视频网站下载视频的程序” - Pypi

有关详细信息,您可以查阅文档

编码模式开启

我们开始吧。

我们将从播放列表(例如https://www.youtube.com/playlist?list=)中提取链接,并使用程序自动下载每个视频。这只是一个面向初学者的基本项目概述。您可以查阅文档并进行改进。

- 导入库

如果您想跟进这篇文章,可以使用“ https://www.youtube.com/playlist?list=PLGzz7pyosmlJfx9ivigemSouoZR9uLT2- ”作为输入链接,如下例所示。这样更容易理解。另外,请确保您使用的播放列表中的视频可以下载,并且没有被删除的视频。这个问题可以使用异常处理代码块来解决,但为了保持这篇文章对初学者的简洁性,我们没有添加该代码块。

导入前请确保已下载所需的库。您可以使用:

pip install selenium
pip install youtube-dl


from selenium import webdriver
import time 
import youtube_dl 
import os

Enter fullscreen mode Exit fullscreen mode

- 使用播放列表 URL 初始化 Chrome WebDriver


url = input("Enter the Youtube Playlist URL : ")
driver = webdriver.Chrome() 
driver.get(url)
time.sleep(5)

Enter fullscreen mode Exit fullscreen mode

用于通过输入 URL 启动 Chrome 浏览器。time.sleep
(5)提供了一个时间间隔,用于启动驱动程序。

- 从播放列表中抓取所有视频链接


playlist=[]
videos=driver.find_elements_by_class_name('style-scope ytd-playlist-video-renderer')

Enter fullscreen mode Exit fullscreen mode

首先,我们创建一个名为“playlist”的空列表,用于存储所有要提取的链接。

接下来就需要用到网络爬虫技术了。
为了便于理解,我们可以用一行代码 `
driver.find_elements_by_class_name('style-scope ytd-playlist-video-renderer')`来提取源文件中所有属于指定类名的内容。

- 刮擦(第二部分)


for video in videos:
    link=video.find_element_by_xpath('.//*[@id="content"]/a').get_attribute("href")
    end=link.find("&")
    link=link[:end]
    playlist.append(link)
"""
For example, a playlist with 6 videos

Enter youtube playlist link : https://www.youtube.com/playlist?list=PLGzz7pyosmlJfx9ivigemSouoZR9uLT2-
['https://www.youtube.com/watch?v=iyL9-EE3ngk&list=PLGzz7pyosmlJfx9ivigemSouoZR9uLT2-&index=1', 'https://www.youtube.com/watch?v=G7E8YrOiYrQ&list=PLGzz7pyosmlJfx9ivigemSouoZR9uLT2-&index=2', 'https://www.youtube.com/watch?v=79D4Y1cUK7I&list=PLGzz7pyosmlJfx9ivigemSouoZR9uLT2-&index=3', 'https://www.youtube.com/watch?v=MUe0FPx8kSE&list=PLGzz7pyosmlJfx9ivigemSouoZR9uLT2-&index=4', 'https://www.youtube.com/watch?v=UkpmjbHYV0Y&list=PLGzz7pyosmlJfx9ivigemSouoZR9uLT2-&index=5', 'https://www.youtube.com/watch?v=WTOFLmB9ge0&list=PLGzz7pyosmlJfx9ivigemSouoZR9uLT2-&index=6']


"""
Enter fullscreen mode Exit fullscreen mode

新术语?XPath?(超级英雄路径?)

XPath是Selenium中用于遍历页面HTML结构的一种技术。
简单来说,它就是一条查找特定标签的路径。

循环会检查“videos”对象中的所有元素。

video.find_element_by_xpath('.//*[ @id ="content"]/a').get_attribute("href")
查找 id="content" 的 division 下的所有锚标签或链接,并提取或抓取它们的 href。

代码的其余部分用于验证,通过从链接中去除播放列表 ID 和索引号,仅查找所选播放列表的视频链接。


"""
After processing it looks like:


Enter youtube playlist link : https://www.youtube.com/playlist?list=PLGzz7pyosmlJfx9ivigemSouoZR9uLT2-
['https://www.youtube.com/watch?v=iyL9-EE3ngk', 'https://www.youtube.com/watch?v=G7E8YrOiYrQ', 'https://www.youtube.com/watch?v=79D4Y1cUK7I', 'https://www.youtube.com/watch?v=MUe0FPx8kSE', 'https://www.youtube.com/watch?v=UkpmjbHYV0Y', 'https://www.youtube.com/watch?v=WTOFLmB9ge0']
"""

Enter fullscreen mode Exit fullscreen mode

想知道为什么是这些特定的课程吗?

替代文字

视频链接位于这些部分下方。

- 下载视频


os.chdir('C:/Users/Trideep/Downloads') 

for link in playlist:
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            ydl.download([link])
driver.close()

Enter fullscreen mode Exit fullscreen mode

os.chdir('C:/Users/Trideep/Downloads')
用于将下载位置更改为“Downloads”。

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([link])

接下来是 Youtube-dl。它会遍历“播放列表”列表,并使用 YoutubeDL 处理和下载每个链接。

`ydl.download('目录 URL')` 会处理链接并将其下载到指定的目录。
您还可以使用 youtube-dl 的其他属性添加视频规格或视频类型。

driver.close()用于关闭驱动程序。

简单一

仅仅 30 行代码,你就省下了几美元,还给自己打造了一个不错的项目。
当然,为了确保程序正常运行,你可以添加自己的异常处理代码块和逻辑。我建议你仔细阅读一下文档。

只是个梗而已
完整代码请访问:

https://github.com/Dstri26/YoPlaDo-Youtube-Playlist-Downloader/

祝您数据抓取愉快!祝您编程愉快!

这是我的第一篇技术博客。如有错误,敬请指正。<3 <3 <3

文章来源:https://dev.to/spectrumcetb/download-a-whole-youtube-playlist-at-one-go-3331