欢迎光临散文网 会员登陆 & 注册

在本地建立一个 Bangumi 数据库

2022-01-16 18:42 作者:Flinx_方凌旭  | 我要投稿

使用自己复刻的数据库可以查询得到如下问题的答案

  • 所有名字中含有“昴”的角色

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

  • 所有名字中含有“昴”的角色及其声优

  • “没有什么好怕的了”这一台词的出现过的剧集及时间

建立步骤

  1. 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

  2. 使用bangumi_db.sql在MySQL数据库中建立数据表

  3. 依次运行 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

  4. 删除ass_dialogue数据表的索引(加快导入速度)

  5. 使用 Navicat 的导入功能导入assDia文件夹下csv文件至ass_dialogue数据表

  6. 重建ass_dialogue数据表的索引(约需20分钟)

数据表行数统计

  • bangumi__type2:18757

  • bangumi_ep:217513

  • bgm_character:38692

  • bgm_person__cv:4428

  • bgm-crt-cv:82524

  • ass_file:59258

  • ass_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

  • 遍历bcccrtcv文件夹中文件

  • 读取信息插入到bgm-crt-cvbgm_characterbgm_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查询示例

按名称查询作品

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

按作品ID和章节序号查询章节

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

搜索名字中含有“昴”的角色

问题来源:https://www.bilibili.com/bangumi/play/ss6306

由于主要使用动画作品相关资料建立数据库,故查询结果不全

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

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

搜索“没有什么好怕的了”这一台词的出现过的剧集及时间

注:部分作品字幕有多个版本,查询结果有重复


在本地建立一个 Bangumi 数据库的评论 (共 条)

分享到微博请遵守国家法律