---
# System prepended metadata

title: 项目设计

---

# 项目设计
设计一个爬取B站数据的爬虫。主要功能就只是单纯地**爬取**并**储存**通过bilibiliapi（或者还有通过html爬取）的数据。以“插件”的形式来从数据库获取数据用于展示、统计等用途。

[TOC]

# 模块初步设计
## 总体设计
做好接口的明确和详细的定义，各个模块相互独立，这样不容易因为一个模块的设计的问题导致全盘翻车。

## 爬取模块
因为哔哩哔哩没有对爬虫做很大限制，甚至直接提供API，网上能轻易找到很多[相关API](https://github.com/topics/bilibili-api)给你用，所以我们爬取模块主要工作可能就是解析通过API获取的json。该模块的同学请没事多翻翻看，了解下有啥有意思的信息可以爬取下来。

另外全靠API是不是太没技术含量了？可以考虑去了解下怎么从HTML里爬取有用的数据出来。


## 数据储存模块
目前考虑用MySQL

## 系统界面模块
控制台，或是GUI都行。
Java不适合写桌面程序，考虑写Web应用。

## 数据可视化模块
感觉看着效果还不错的开源库
https://github.com/jtablesaw/tablesaw


# 模块具体设计

## 系统界面模块
功能列表：
* 选取爬取任务
* 提交爬取任务
* 控制单个爬取任务（暂停继续终止）

没有和数据库直接交互。

UI界面的设计思路：


## 爬取模块
### CrawlerRunner
通过CrawlerManager进行对TaskRunner的控制。

### TaskRunner
就是个线程，继承了Thread，作为爬取任务的一个**容器**。接受来自CrawlerManager的控制，启动暂停终止等操作。

### XXTask
提供对单独的爬取目标的代码逻辑，也就是怎么爬的那些函数。创建TaskRunner时，指定这个TaskRunner的Task，TaskRunner就能利用Task里提供的爬取方法来进行爬取。

本身不包含多线程的逻辑。只是提供方法给Runner去用。

XXTask负责在每一次爬取后调用数据库模块来储存爬取信息。



## 数据库模块
提供简单的数据库操作抽象。

连接数据库（数据库是预先创建的）

清空数据表（数据表是预先创建的），每次setupDB的时候会清空。