一次性下载整个 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
- 使用播放列表 URL 初始化 Chrome WebDriver
url = input("Enter the Youtube Playlist URL : ")
driver = webdriver.Chrome()
driver.get(url)
time.sleep(5)
用于通过输入 URL 启动 Chrome 浏览器。time.sleep
(5)提供了一个时间间隔,用于启动驱动程序。
- 从播放列表中抓取所有视频链接
playlist=[]
videos=driver.find_elements_by_class_name('style-scope ytd-playlist-video-renderer')
首先,我们创建一个名为“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']
"""
新术语?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']
"""
想知道为什么是这些特定的课程吗?
视频链接位于这些部分下方。
- 下载视频
os.chdir('C:/Users/Trideep/Downloads')
for link in playlist:
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([link])
driver.close()
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/
祝您数据抓取愉快!祝您编程愉快!




