前一段时间接了个小任务,要把YouTube上的几百个视频下载回来,用百度云网盘分享给公司的同事供学习使用。
当老板发邮件问我这事儿是否能办时,我很快就回复说没问题,因为“从YouTube下载视频”这种事之前我也不是没做过。网上有一大批在线工具能够嗅探出YouTube视频的下载链接,然后直接用常规手段(迅雷啥的)下载就可以了。本地下载工具也不少,如著名的IDM就能够直接下载网页上嵌套的视频文件,几乎是万能的。不过,这次的任务有点复杂:一来要下载的文件太多了,我总不能重复操作几百次来下载每个视频吧;二来,还得上传到百度云,这么多视频,靠我家里那小水管,没个几天几夜恐怕是上传不完的,多费劲呀。
然后我就开始琢磨这件事能不能更自动化、更高效一些来实现。呃,放狗上Google搜了一下,找到了几个大杀器,参考了一下各位大神的教程后,我也拼凑出了一个解决方案。
长话短说:
在美国VPS上安装YouTube专用下载工具,远程下载想要的YouTube视频到服务器上;在VPS上安装百度云网盘上传工具,将已经下载到VPS中的视频上传到云端。
这个方案的好处很明显:用位于美国的VPS下载本身服务器就在美国的YouTbe网站视频,速度相当快(实测可以超过60MB/s)。从美国VPS上传文件到百度云,速度虽然受限(一般是几百Kb每秒,偶见超过1MB/s的),但仍比我在国内本地的上传网速要快得多。更重要的是,这个方案是高度自动化、批量进行的,不用手动对付每个视频。
短话长说:
接下来要写的详细教程,是一个大杂烩。你在网上能找到的特定教程,都是有特定限制条件的,例如你的VPS用的是啥操作系统,你要实现多大程度的自动化,等等。在完成这个教程的过程中,我也踩了不少坑,幸亏有万能的Google相助。
1 安装VPS操作系统
我用的是DigitalOcean(若使用我的推荐链接注册DigitalOcean,您的账户可以立即获得10美金,相当于免费获得两个月的使用权)最基础的套餐,每月5$,20G的SSD储存空间,1T流量。安装的操作系统是CentOS 7(请注意操作系统的选择,这很重要,后面我会提到原因),节点为旧金山(据说从大陆访问会比较快)。所以,如果你也是DO用户的话,可以完全照我这篇教程来做,准没问题。不是的话,请酌情参考就好了,其他问题我不负责解答哈,毕竟,我是一个伪技术流……
首先要赞下DigitalOcean的VPS用起来真是方便,点几下鼠标就能创建好一台服务器。理论上用SSH密钥登录会更安全,不过我偷懒,只是简单用LastPass生成一个几十位长度的随机密码,需要用到就复制粘贴一下好了(请大家不要向我学习……)。禁用root账号登录,修改SSH端口号什么的,这些安全措施也可以做下,我就不多说了,不太清楚的话请自行Google。
前面提过VPS的操作系统问题,为啥我用CentOS 7呢?因为这个版本默认自带的Python是2.7.5(截至本文发布时是这样的),而这个教程中会用到的百度云网盘Linux客户端(bypy)依赖的Python版本号为2.7x。一开始我装了个CentOS 6,其自带Python 2.6x,不符合要求;Google了好多教程,还是没能装上Python 2.7x(在DO的这个系统上需要自行编译Python,各种报错很无奈);最后决定放弃CentOS 6,换成7,因为有那个工夫折腾Python,我还不如去看几集美剧是吧,呃,好像我又无意中暴露了什么……
2 安装youtube-dl
传说中的第一个大杀器终于粗线了:youtube-dl。这个工具可以用来下载一系列国外网站的在线视频,如油管家的。它既有本地客户端,也可以被部署在服务器上。
用Putty登入VPS后,依次执行以下两条命令:
wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
chmod a+rx /usr/local/bin/youtube-dl
然后就没了。是的就是这么简单,现在你已经装完youtube-dl,可以在VPS上远程下载指定的YouTube视频了。
最简单的命令如下:
youtube-dl video-url
把上面的这个video-url换成具体某个YouTube视频的URL就可以直接下载了。注意,youtube-dl会默认下载视频到当前执行命令的目录下。
YouTube有Playlist功能,即播放列表,你可以用Google账号登录,然后就可以把若干视频添加保存到Playlist。如果你想要批量下载某个Playlist的视频,就可以把前面那条下载命令中的 video-url换成具体Playlist的链接。话句话说,想要一次下载多个YouTube视频,你可以考虑用这个Playlist功能。
不过呢,像本文开头提到的这个任务,如果我要手动添加几百个视频到Playlist那得累到手抽筋:我得先点开每一个视频的具体链接,然后再点两下鼠标才能将之添加进Playlist。好了不绕弯了,说这么多,就是想烘托出youtube-dl的另一个激动人心的功能:支持读取下载链接列表文件。这意味着我可以先把所有下载链接整理好后放进一个txt文件,然后让youtube-dl去读取这个txt文件就行了,接下来它就会自动下载全部的视频。该方法的命令如下:
youtube-dl -a video_url.txt
这里的 -a 参数表示读取外部链接文件。
具体细节操作在后面会提到,请耐心往下看……
3 安装byby
Byby是一个百度云网盘的Python客户端,可在Linux环境下通过命令行来操作。
在本文的操作环境下,安装byby需要更多的步骤,byby官网没有介绍那么详细,所以我参考了其他网友的教程。
# 安装Git
yum install git
# 安装Python Pip
yum -y install epel-release
yum -y install python-pip
yum clean all
说明:先装扩展源EPEL再装Python Pip才不会报错。
# 安装Requests
pip install requests
完成以上步骤后,才开始正式安装bypy。
依次执行以下三行命令:
git clone https://github.com/houtianze/bypy byby/
cd byby/
python bypy.py list
此时的命令行界面会出现提示,按照以下步骤来授权你的百度云账号使用bypy客户端:
- 左键选中用于百度账号授权的那行URL,即可复制该文本(在Putty中选中即可复制,不用Ctrl+C),在浏览器中打开此链接。
- 登录你的百度账号,然后复制授权码。
- 回到Putty命令行界面,粘贴授权码进去,回车即可开始启动授权操作。
稍等几秒,授权即可成功。
为了方便在任意目录下使用bypy命令,还需要设置如下:
cd /byby
cp bypy.py /usr/bin
完成以上设置后,如果要将VPS某个文件夹下的所有文件上传到百度云,最简单的命令如下:
bypy.py upload
还可以加参数,如 -v 可以显示上传进度:
bypy.py upload -v
默认情况下,本方案上传到百度云的文件全部存放在“我的应用数据 –> bypy”路径下。
4 下载与上传视频
在Putty命令行界面中创建一个专门的目录用于存放下载的视频文件,然后CD至此目录下,创建一个包含所有下载链接的txt文件(使用vi命令即可)。在此目录下,执行下载命令:
youtube-dl -c -i -a video_url.txt
呃,眼尖的你可能已经发现了,上面这条命令好像多出了两个参数?没错,youtube-dl提供了很多有用的附加参数,这里用到的是:
- -c 断点续传(如果由于意外原因下载中断了,再次启动下载命令时,可以实现断点续传)
- -i 忽略报错(如果出现某些链接无法打开或者下载的问题,会自动绕过,继续下载其他视频)
下载的话一般很快,但是上传到百度云并没有那么快。为了防止关闭Putty窗口后,下载/上传进程就断掉了,可以考虑使用Screen远程会话管理功能。简单介绍就是,有了这玩意儿,你可以在Putty中启动下载或者上传进程,让其在后台运行,然后关掉Putty离开电脑旁该干啥干啥去,有需要的话回来重新打开窗口就可以看到进程依然在跑。
要检查操作系统是否支持screen,可以直接输入screen然后回车,如果提示找不到这个命令,那就是系统还没安装好这个东西。在CentOS 7中安装screen很简单,一条命令而已:
yum install screen
安装完毕后,输入 screen -S sessionname 即可创建一个名为 sessionname 的screen会话窗口。在此窗口中执行想要做的任务,然后同时按下 ctrl + a,松开后按下 d,即可将此session放到后台去运行,并回到之前的对话窗口。在非screen对话窗口中,输入 screen -ls 可以列举已有的screen进程。输入 “screen -r 进程代码” 就可以再次调出正在运行的screen进程。
由于我要上传到百度云的文件太多了,我不可能守在电脑前等它完成所有任务,所以screen这个功能还是非常实用的。
本文主要参考链接:
https://github.com/rg3/youtube-dl/
https://github.com/houtianze/bypy
http://yesido.info/2015/03/linux-upload-document-to-baidu-cloud/
bypy能设置百度云的推送云设备吗?
没发现呢,得去翻一下bypy的官方说明~
我的vps硬盘比较小 能不能自动传大量的视频 自动删除?
我的VPS硬盘也很小呀,所以当时为了那个任务,我是分为三次才下载/上传完毕的。
DO我下载视频大于400以上的第一次能下载,第二次下载会卡掉后面,然后整个VPS死了,PING不同,要再次重启才好。你会碰到这种情况吗?
我检查了一下之前的下载记录,有部分视频是超过400M的,我前后分为三次下载(硬盘容量限制),并没有出现卡掉的现象呢。
对于你那个video_url.txt文档,Youtube链接是接到任务的时间就提供给你的? 要不还得从Youtube网站上一个个的复制到这个文档里面.也挺麻烦的.
其实我是用了一个取巧的办法。Boss交给我的任务是一篇博客文章,上面集合了数百个视频链接,我只需要直接页面全选复制,选择用迅雷下载,不过迅雷当然是下载不了的,我只是利用迅雷的下载框有一个过滤条件的功能,把所有YouTube视屏页的链接弄到下载列表去,最后在迅雷的下载列表复制所有下载链接,就可以得到所有的URL。
哦哦,原来如此,已经有链接就好解决了.你的博客没有一个回复邮件提醒功能.我是又想起来这事了才看到你的回复. 你可以试着把回复邮件提醒给加上.
很多年前刚开始玩WP时流行给博客加上邮件回复,也曾折腾过。后来流行类似“多说”等第三方评论服务(可惜多说关闭了),我觉得这样的话评论门槛更低(不需要输入个人邮件地址,大家都很懒的)。我这个博客评论量也不高,多说关闭之后,也暂时就没加上邮件回复了。估计过一段时间,会心血来潮给加上吧,哈哈~
我弄了一个Youtube视频在线下载。https://www.youtubemy.com/ 欢迎反馈意见。谢谢。