在本地建立一个 Bangumi 数据库

使用自己复刻的数据库可以查询得到如下问题的答案
所有名字中含有“昴”的角色
所有名字中含有“昴”的角色及其出场作品
所有名字中含有“昴”的角色及其声优
“没有什么好怕的了”这一台词的出现过的剧集及时间
建立步骤
clone以下 Github 项目到同一文件夹中
Bangumi 条目静态数据快照:https://github.com/czy0729/Bangumi-Subject
Bangumi 人物静态数据快照:https://github.com/czy0729/Bangumi-Mono(非必需)
Bangumi Data:https://github.com/bangumi-data/bangumi-data
字幕共享计划:https://github.com/foxofice/sub_share
建立 Bangumi 数据库所需代码:https://github.com/Flinx-LY/Bangumi-Database
使用
bangumi_db.sql
在MySQL数据库中建立数据表依次运行 Bangumi-Database 中的如下文件
spider_crt.js
spider_cv.js
spider_bcc.js
mysql_subject&ep.js
mysql_bgmdata.js
mysql_cn.js
mysql_bcc,crt,cv.js(需要更改
indAction
变量运行三次)mysql_assFile.py
mysql_assDia.py
删除
ass_dialogue
数据表的索引(加快导入速度)使用 Navicat 的导入功能导入
assDia
文件夹下csv文件至ass_dialogue
数据表重建
ass_dialogue
数据表的索引(约需20分钟)
数据表行数统计
bangumi__type2
:18757bangumi_ep
:217513bgm_character
:38692bgm_person__cv
:4428bgm-crt-cv
:82524ass_file
:59258ass_dialogue
:27770149

部分代码介绍
Bangumi-Subject
ids.js
爬取 2020 年的动画条目、所有类型的排行榜上的条目、bangumi-data 里面的所有条目的ID,保存于
ids
spider.js
从
ids
读取作品ID列表遍历作品ID列表,使用API获取及爬取对应作品资料保存于
data
文件夹
spider-by-index.js
指定开始ID和结束ID,生成作品ID列表
遍历作品ID列表,使用API获取及爬取对应作品资料保存于
data
文件夹
cn.js
遍历
data
中作品资料文件,读取作品的中文名称保存于cn
文件夹
rate.js
遍历
data
中作品资料文件,读取作品的评分保存于cn
文件夹
Bangumi-Mono
spider.js
从
Bangumi-Subject/ids
读取作品ID列表遍历作品ID列表,从
Bangumi-Subject/data
读取对应作品资料文件中角色ID或人物ID列表遍历角色ID或人物ID列表,爬取对应角色资料保存于
data
文件夹或人物资料保存于person
文件夹
cv.js
遍历
data
中角色资料文件,从中读取声优ID列表遍历声优ID列表,爬取对应声优资料保存于
person
文件夹
Bangumi-Database
spider_crt.js
遍历
Bangumi-Mono/data
中角色资料文件,建立角色ID列表(已缓存,无需Bangumi-Mono/data
)遍历角色ID列表,爬取对应角色资料保存于
crt
文件夹
Bangumi-Mono/spider.js
没有考虑到一个角色可能有多个声优为其配音,故在其代码基础上加以修改。
例子:https://bgm.tv/character/44166
spider_cv.js
遍历
crt
中角色资料文件,从中读取声优ID列表遍历声优ID列表,爬取对应声优资料保存于
cv
文件夹
spider_bcc.js
从
Bangumi-Subject/ids
读取作品ID列表遍历作品ID列表,爬取对应作品ID-角色ID-声优ID关系表保存于
bcc
文件夹
mysql_subject&ep.js
遍历
Bangumi-Subject/data
中作品资料文件读取作品信息插入到
bangumi__type2
数据表读取章节信息插入到
bangumi_ep
数据表
由于Bangumi-Subject/data
中的部分json文件在保存时没有对英文引号进行处理,导致它们的json解析会失败,故使用如下代码在首次失败后进行正则替换再次解析。
mysql_bgmdata.js
遍历
bangumi-data/data/items
中每月作品资料文件读取官网和开始日期更新
bangumi__type2
数据表
mysql_cn.js
读取
Bangumi-Subject/cn/data.json
中作品中文名称对照表遍历中文名称对照表,读取中文名称更新
bangumi__type2
数据表
mysql_bcc,crt,cv.js
遍历
bcc
或crt
或cv
文件夹中文件读取信息插入到
bgm-crt-cv
或bgm_character
或bgm_person__cv
数据表
本文件需要运行三次,请更改indAction
变量分别完成以上三项工作
mysql_assFile.py
遍历
sub_share/subs_list/animation
中字幕文件使用正则表达式从文件路径中获取字幕与作品的关联信息,插入到
ass_file
数据表
mysql_assDia.py
遍历
sub_share/subs_list/animation
中字幕文件从
ass_file
数据表中查询ass文件ID将台词的文本内容、时间连同ass文件ID保存至
assDia
文件夹下多个csv文件中,每个含100万行此后使用 Navicat 的导入功能导入csv文件至
ass_dialogue
数据表
简要说明
在Bangumi-Subject/data
文件夹下有30万条json格式的Bangumi条目数据。
如果使用MongoDB数据库,则执行如下这样的node.js代码即可直接导入json数据。
我使用了MySQL数据库,故需要设计表的结构以处理数组对象、子Object对象和一对多、多对多关系。
其关键是bgm-crt-cv
关系表,因为作品-角色、角色-声优均为多对多关系。
而作品-剧集是一对多关系,只需在bangumi_ep
剧集数据表设置一个B_bangumi_id
字段指向作品数据表ID即可,B_
前缀指明这是一对多关系。
注:ass_file
数据表的R_bangumi_id
字段中的R_
前缀表明这一字段的数据可以查询获得,为简化操作而保存于此。
[未完,待补充]

MySQL查询示例
按名称查询作品

按名称和开始日期查询作品


搜索名字中含有“彼方”的角色(两种方法)

搜索名字中含有“昴”的角色
由于主要使用动画作品相关资料建立数据库,故查询结果不全

搜索名字中含有“昴”的角色及其出场作品

搜索名字中含有“昴”的角色及其声优

搜索“没有什么好怕的了”这一台词的出现过的剧集及时间
注:部分作品字幕有多个版本,查询结果有重复


