利用Selenium和Browsermob批量嗅探下载Bilibili网站视频

目录 技术

日常生活中,用电脑看视频是非常频繁的事情。最常上去的网站,莫过于B站了。经常在看到一些精彩的视频的时候,想下载下来。当然,少量的视频,我们可以用一些浏览器插件来进行下载。但是如果我们同时想下载成百上千个视频,就需要借助程序来实现了。

我们先来看看我们准备要下载的视频,B站鬼畜区月排名前100的视频列表网页。我们的任务就是要把这100个视频下载下来。

下图是下载下来的视频文件截图。

视频文件截图

如果不愿意看代码可以直接看视频:

 

爬取100个视频的网页并存储

我们第一步要做的就是要讲这100个视频的网址爬取下来。打开排名网页,查看其网页源文件,我们发现源文件中并没有视频列表的信息。这是因为这个视频列表的页面是由http://static.hdslb.com/js/core-v5/page.ranking.js这个javascript文件生成的。这时候,如果用urllib或者requests这样的工具,就需要解析js文件才能爬取到索要的信息。这里我们也不用费劲去解析这个js文件。直接利用Selenium包。Selenium包由于是打开了浏览器,进行了渲染,所以得到的page_source是渲染之后的网页源文件,这个源文件中包含了这100个视频列表的信息。

得到的视频列表的信息,接下来就可以直接用regex正则表达式找到所需要的信息,这里我们提取三个信息。1,视频排名,2,视频链接,3,视频名称。整个爬取的过程代码如下:

运行这段程序,我们能够得到如下的结果。这样我们就得到了所有视频的链接地址。注意,如果我们只想让代码静静的运行,而不想看到浏览器打开、关闭的画面。那么可以不使用Firefox和Chrome,可以使用PhantomJS,这个浏览器是无头浏览器,也即浏览器运行的时候是没有界面的。

视频链接信息

视频文件地址的嗅探与下载

在得到所有的视频链接之后,接下来就到了这篇文章最重要的部分了。给定一个视频页面的地址,例如http://www.bilibili.com/video/av6108496/ ,我们怎么下载这个页面的视频呢?

最传统的做法是,用尽各种办法,来分析、解析以及猜测视频的源地址。这样的做法有两个缺点。第一个缺点是,每个视频网站的视频源地址规则差别巨大,代码难以复用。第二个缺点是,一旦视频网站有所改版,又得重新分析、解析以及猜测源地址。

这里面,我们使用一个比较少用的办法。由于我们使用的是Selenium,也就是说实际上是发生了网页的加载和渲染的,因此就一定有Network Traffic。我们只要利用工具来嗅探到这个Network Traffic就行。幸运的是,目前有一款从JAVA上移植过来的工具可以做到这一点,这就是BrowserMob。我们利用BrowserMob建立监控,监控Selenium打开网页所产生的Network Traffic,再从众多的Network Traffic中找到视频链接地址。

上面这段代码的作用是,首先获得加载页面后的Network Traffic数据,从这些数据中获取视频源地址的链接。再利用requests将视频下载到电脑中去。。

完整的代码如下。这个代码实现了下载这个页面的100个视频的任务。