9行代码实现YouTube视频批量下载

先上源码:

import re, os, requests

url = r"https://www.youtube.com/playlist?list=PLXO45tsB95cK7G-raBeTVjAoZHtJpiKh3"    #youtube播放列表
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
html = requests.get(url, headers=headers).text
videoIds = re.findall('"videoId":"([A-Za-z0-9_-]{11})","thumbnail"', html)
for videoId in videoIds:
    download_link = "https://youtu.be/" + videoId  # 构造下载地址
    os.chdir(r"C:\Users\Ph\Videos\RL")
    os.system("youtube-dl " + download_link)  # 用youtube-dl下载视频

从YouTube批量下载视频只有两步:

  1. 拿到播放列表里每个视频的url
  2. 使用youtube-dl下载视频

其中第一步拿到每个视频的url有两种方法,以上代码是第一种方法,简单粗暴。

仔细分析视频url的结构可以发现,最重要的是一个11位的videoId (不一定全都是11位)。并且可以发现videoId是由字母A-Za-z数字0-9和符号-_组成的 (不排除还有其它特殊符号)。 所以,要拿到每个视频的url只需要拿到每个视频的videoId即可。

第一种方法是使用requests请求播放列表页面拿到网页源代码,然后直接用正则表达式匹配拿到该页12个视频的videoId。再拼接构造下载地址并使用youtube-dl下载视频。

关于youtube-dl的安装和使用可以参考这篇博客

当然,上面的代码有刻意写短的嫌疑。实际写爬虫代码在写requests请求时应该加上try...except...来捕获请求异常并作相应处理。


下面介绍第二种方法,用webdriver模拟无头浏览器来拿到视频url。

设置Chrome无头浏览器,拿到播放列表页面的网页源代码:

from selenium import webdriver

opt= webdriver.ChromeOptions()
opt.add_argument('headless')
driver= webdriver.Chrome(chrome_options=opt)
driver.get(url)
r = driver.page_source

但这里拿到的page_source和上面第一种方法requests.get拿到的网页源代码是不一样的。这里拿到的是浏览器解析执行JavaScript代码后渲染出来的Elements。

然后就是解析page_source来拿视频url啦。通过定位可以发现视频url藏在idthumbnaila标签中:

a标签

这一步可以用XPath:

from lxml import etree

html = etree.HTML(r)
div = html.xpath('//a[@id="thumbnail"]')
for a in div:
    link = a.get('href')
    videoId = re.findall(r'v=(.*?)&', link)[0]
    download_link = "https://youtu.be/" + videoId

也可以用pyquery:

from pyquery import PyQuery as pq

doc = pq(r, parser="html") 
links = doc('a#thumbnail').items()
for a in links:
    link = a.attr['href'])
    videoId = re.findall(r'v=(.*?)&', link)[0]
    download_link = "https://youtu.be/" + videoId

用pyquery这里有个小坑,观察page_source第一行可以发现有 xmlns="http://www.w3.org/1999/xhtml"。 而pyquery默认解析后的文档是xmlns格式,因此需要配置parse="html",否则使用a#thumbnail无法正常拿到a标签。

拿到的link以及download_link如下:

视频links

下面是下载过程及结果:

downloading

videos

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

Python程序员都会喜欢的6个库,拿走不谢!

在编程时,小挫折可能与大难题一样令人痛苦。没人希望在费劲心思之后,只是做到弹出消息窗口或是快速写入数据库。因此,程序员都会喜欢那些能够快速处理这些问题,同时长远...

21950
来自专栏*坤的Blog

Opera福利谷歌

31330
来自专栏FreeBuf

软件逆向之陌路寻踪:突破未注册版软件的限制功能

摘要:试图对一个“太监版”的程序进行完整化,也就是把限制的功能恢复,把阉割的功能添加等等。 试验软件:PixtopianBook.exe (一个通讯录软件) 试...

25750
来自专栏张戈的专栏

WordPress后台首页显示RSS错误的解决办法

这两天,麻烦不断,可能是因为我折腾的比较频繁吧!老是出现奇奇怪怪的问题,而且百度、GG 居然搜不到有用的解决办法!折腾了大半天,终于被我搞定,虽然还是很笨的方法...

40860
来自专栏全栈工程师成长之路

全栈开发自学路线

这里筑梦师,是一名正在努力学习的iOS开发工程师,目前致力于全栈方向的学习,希望可以和大家一起交流技术,共同进步,用简书记录下自己的学习历程.

958130
来自专栏小白课代表

软件分享 | C4D R17 安装教程

11740
来自专栏美团技术团队

Shield:支撑美团点评品类最丰富业务的移动端模块化框架开源了

引言 一直以来,如何能更高效地开发与维护页面是Android与iOS开发同学最主要的工作和最关心的问题。随着业务的不断发展,根据特定业务场景产生的定制化需求变得...

48390
来自专栏Android-JessYan

解决Retrofit多BaseUrl及运行时动态改变BaseUrl?

原文地址: http://www.jianshu.com/p/2919bdb8d09a

31830
来自专栏小白课代表

软件分享 | C4D R18 安装教程

18730
来自专栏Python专栏

Python | 爬虫抓取智联招聘(基础版)

运行平台: Windows Python版本: Python3.6 IDE: Sublime Text 其他工具: Chrome浏览器

29810

扫码关注云+社区

领取腾讯云代金券