如何下载网页中的视频?
写在前面
现在由于很多版权保护的原因,很多网站的视频资源都做了处理。一方面可以更好的节约资源,节省带宽。另一方面也可以防止普通的大众程序小白白嫖下载。
为了更好的帮助到一些人的特殊需求,想要download某一两个视频而苦于要办理会员的窘迫,教大家如何去下载网页中的视频。当然,如果条件允许,希望大家支持正版,尊重版权。
前提知识
本篇浏览器均以Chrome谷歌浏览器为例。在Chrome中,按下F12可以进入开发者工具。
在下载视频时主要会遇到以下两种情况,一种是明确的看得到的视频地址,另一种是做了处理的视频地址,通常会看到以blob:开头。第一种情况通常是一次性去服务器请求整个视频资源,加载到页面上。第二种情况通常是把一个视频切成很多碎片,然后不停地去向服务器请求碎片数据,然后无缝地拼接到正在观看的视频后面,喜闻乐见的边下边播也是这个道理。
第一种情况
在弹出的开发者工具的左上角,会有一个鼠标箭头的图标,点击箭头,再点击网页中的视频,开发者工具会显示网页视频资源的地址。通常情况下会有一个video标签,像这个样子<video src="http://aliuwmp3.xxx.com/userdata/video/1212352095.mp4"></video>,其中的src中的内容就是视频地址链接,直接右键打开或下载均可。
是不是很简单呢?别人开通会员才可以下载的东西你也可以下载了,满满的成就感有没有?
第二种情况
当你去某些大型视频网站下载,用上面的方法时,会发现往往不能奏效,原因是在src里的是以blob开头的一个地址,然而打开后却又返回404,现如今大部分视频都做了处理。
HLS (HTTP Live Streaming), 是由 Apple 公司实现的基于 HTTP 的媒体流传输协议。HLS以ts为传输格式,m3u8为索引文件(文件中包含了所要用到的ts文件名称,时长等信息,可以用播放器播放,也可以用vscode之类的编辑器打开查看),在移动端大部分浏览器都支持,也就是说你可以用video标签直接加载一个m3u8文件播放视频或者直播,但是在pc端,除了苹果的Safari,需要引入库来支持。
用到此方案的视频网站比如某酷,可以在视频播放时通过调试查看Network里的xhr请求,会发现一个m3u8文件,和每隔一段时间请求几个ts文件。
我们的src地址其实是一个以blob开头的地址,可以理解为它是一个视频容器。简单的理解来说就是通过一些手段,服务器将视频资源切成了若干份。当我们开始播放视频时,浏览器才会向服务器请求下一个视频碎片,然后再把它添加到那个视频容器中。
下载方法
大概的原理知道了,现在如何去下载呢?
- 依然是打开开发者工具,最上面一行里找到
Network。Network中就是当前网页和服务器的交互请求,在这里甚至可以看到请求花费了多少时间,请求的文件数据的大小等。 - 在第三排找到
XHR,这里就是浏览器向服务器发送的请求。一般来说,在第一个文件或是前几个文件中,会有一个带有m3u8字样的请求。如果没有,请刷新页面,重新加载播放视频。 - 点开带有
m3u8字样的这条请求,这就是索引文件,在右侧Preview中会看到索引文件的内容。其中会有视频的一些信息,譬如视频尺寸大小,即通常意义上理解的分辨率。#EXT-XXXX-VIDEO-WIDTH:1280 #EXT-XXXX-VIDEO-HEIGHT:720 - 复制索引内容到任意文本编辑器中(记事本也行,呵呵),删去
#开头的信息(#号开头的是注释)。 - 打开
Preview左侧的Headers,找到索引的请求地址的根目录。复制m3u8字样前面的目录路径。 - 将复制的目录路径添加到文本编辑器中的每个索引前,使之拼接起来。
- 这就是所有的视频碎片的地址,现在可以将其批量下载。仔细观察这些地址的不同,其实不同之处即为视频切割的位置。
所以建议批量逐个下载,注意其下载顺序。
- 下载完毕之后,可以将所有文件按照日期先后顺序排列,所有文件就会按照下载顺序依次排列。然后全选,重命名。
- 如果想无缝连接视频,可以选择各类合并视频的软件,在此不做赘述。
TODO
DASH(Dynamic Adaptive Streaming over HTTP) ,是一种在互联网上传送动态码率的Video Streaming技术,类似于苹果的HLS,DASH会通过media presentation description (MPD)将视频内容切片成一个很短的文件片段,每个切片都有多个不同的码率,DASH Client可以根据网络的情况选择一个码率进行播放,支持在不同码率之间无缝切换。
Youtube,B站都是用的这个方案。这个方案索引文件通常是mpd文件(类似HLS的m3u8文件功能),传输格式推荐的是fmp4(Fragmented MP4),文件扩展名通常为.m4s或直接用.mp4。所以用调试查看b站视频播放时的网络请求,会发现每隔一段时间有几个m4s文件请求。
这种情况下载方法大致相同,方法留待日后补充