路人神对话

看B站的时候,有时候看到很喜欢的总想下载下来,虽然APP里提供了下载,但奈何下载的格式不知道是什么格式,无法在其他播放器里看,于是就想下载到电脑本地播放。当然,就目前而言,WiFi和流量其实足以替代大部分硬件存储。所以这个需求不是很高,只是个人爱好。

【小技巧】一招教你下载b站视频到本地_ide

那么什么视频是可以下载,什么视频不能下载呢?

可以这么说:只要你能在网页观看的视频,都是可以下载的,因为你的浏览器接受到了视频文件才能播放,而我们只需要获取到这些文件就行。当然这依个人技术和网站,有些网站就是不让你下载,层层加密,一般人破解不了,但这只是个别,大部分还是正常的,因为要层层加密网站开发可是要多出钱的。加密的话一般是将视频的接口加密,也有在视频文件上做手脚的。

现在我们就B站举个例子

首先,打开某个视频链接,按F12,然后将所有的数据清除,点击播放视频,这样network里面就有很多数据
【小技巧】一招教你下载b站视频到本地_请求头_02接着,我们一条一条数据看,直到你看到下面这样的
【小技巧】一招教你下载b站视频到本地_搜索_03
那么,右边的这些是什么意思呢,这是二进制数据,所有以文本格式打开会显示乱码,这些大概率是视频文件,图片的话浏览器是会正常显示的。我们接着看headers里的信息。
【小技巧】一招教你下载b站视频到本地_搜索_04我们来解读一下headers里面的信息

Request URL: **发起请求的URL,视频的下载地址**
Request Method: 请求的类型,视频下载正常为GET
Status Code: 状态码,206的话说明链接下的文件是支持range参数的,也就是说我请求头里加一个range参数,说明你想要文件的哪一段,这为文件的断点续传和多进程下载提供了便利
Remote Address: 服务器地址,没什么软用

解读其他

接着看响应头(response headers):

Content-Length: 返回文件长度
Content-Range: bytes4389834-4589025/24268406 (文件位置和总长度,单位字节)
content-type: video/mp4 ,文件类型

这三个是我们看中的,其他没什么用

请求头(requests headers)
Provisional headers are shown ,这句话是谷歌浏览器的毛病,只会显示一部分请求头,如果爬虫不会返回数据,则需要使用抓包软件查看完整请求头了

Origin: 值不重要,加入爬虫头信息就行
Range:bytes=4389834-4589025 ,你要请求的数据
Referer:访问的上一个页面,一般会动态构建,比如av地址
User-Agent: 这个不多说

我们先分析URL是怎么来的,看一下没什么规律,应该不是动态构建的(如果是则需要查看想要js代码),那么要么是通过接口返回的,要么是在从原网页中和网页结构一起返回的,比如https://www.bilibili.com/video/av49336067/。我们先刷新一下页面,将请求URL为https://www.bilibili.com/video/av49336067/链接的response的内容负责到记事本,Ctrl+f搜索刚才视频的链接,如果没有则搜索链接里面的一些关键词,应该有可能数据在js里面,然后动态构建的。

接着今天教材结束,因为视频链接确实在网页返回的数据中,不过当一个网页含有多个视频的时候,就有一点小小的区别,这时候网页数据里没有视频链接,需要带上aid和cid请求另一个接口得到视频的下载地址,这里就不多说了,具体看代码或者自己去尝试。B站没有任何加密很简单。

【小技巧】一招教你下载b站视频到本地_ide_05