基于Java的BiliBili视频信息爬虫

该项目要求设计并实现一个 BiliBili 视频信息爬虫,并且能够将每个分类收藏数前三的视频下载至本地。

该项目使用的软件有Eclipse(IDE)、Charles(抓包工具)、MySQL(数据库)、Navicat Premium(数据库可视化工具)。以下代码截图全部基于OS X系统上自己编写的代码。

了解相关知识

该实验所用到的知识有且不仅限于:

  1. HTTP 请求、响应和重定向;
  2. 使用 apache-httpclient 来实现对服务器的请求并收到响应;
  3. 用 jsoup 处理 html 文件;
  4. 数据库设计与使用;
  5. Java IO下载视频文件;
  6. 同时,该程序使用了 Maven 来管理项目的依赖关系。

抓包并分析

用一个抓包工具来分析浏览器打开 BiliBili 视频网时重要的请求与响应。这里我选用的是 Charles,当然也可以使用 Fiddler 或者其他好用的。

可以看到,图中选中的项即为访问 BiliBili 视频网分类页面时服务器向浏览器发送的 json 文件。路径中 tid 后的数字代表种类,pn 后的数字代表页数。可以看到访问时浏览器发出的请求参数,爬虫程序同样也要设置这些参数使服务器认为是浏览器在访问。而在每一个 json 文件中,有 20 个视频的信息,包括我们感兴趣的 av 号(Bilibili 视频 id号)、作者、种类、收藏数、硬币数等信息。我们之后将要对 json 文件进行处理来获得这些信息,并把它们存进数据库。

爬虫相关方法

  1. 使用apache-httpClient来实现请求并得到响应,最终得到json文件。

  2. 通过JSONArray和JSONObject两个类方法对请求到的json文件进行处理,将得到的视频信息初始化为一个Bilibili对象(Bilibili类在Bilibili.java中定义),并调用JDBC.java中定义的方法将数据存入数据库。

视频下载相关方法

  1. 通过SQL语句选出该种类中收藏数前三的视频,返回其av号及其他信息。通过www.ibilibili.com加上av号,对其发出请求,获得HTML文件。

  2. 使用jsoup,利用标签对HTML文件进行解析,获得以www.bilibilijj.com/Files/DownLoad/为开头的视频下载地址。

  3. 利用JAVA IO的相关方法编写readInputStream和getVideo方法,下载视频保存至本地指定地址。

调用方法并开多线程加速

在main方法中调用之前写好的方法,并开多线程加速爬取和视频下载。

结语

经过反复的设计、编程、测试、修改,最终的程序能够爬取 BiliBili 视频网音乐区 7 个类别约 62 万个视频的信息(由于校园网波动,最后只爬了62w,实际上音乐区应该不止这么多视频),将其存入数据库,并将每个类别收藏数前三的视频下载至本地,符合实验要求。

完整代码已经放在我的 Github 中。由于个人水平有限,可能存在错误或者性能优化方面的问题,欢迎讨论。

项目中参考的资料