在本地建立一個(gè) Bangumi 數(shù)據(jù)庫(kù)

使用自己復(fù)刻的數(shù)據(jù)庫(kù)可以查詢得到如下問(wèn)題的答案
所有名字中含有“昴”的角色
所有名字中含有“昴”的角色及其出場(chǎng)作品
所有名字中含有“昴”的角色及其聲優(yōu)
“沒(méi)有什么好怕的了”這一臺(tái)詞的出現(xiàn)過(guò)的劇集及時(shí)間
建立步驟
clone以下 Github 項(xiàng)目到同一文件夾中
Bangumi 條目靜態(tài)數(shù)據(jù)快照:https://github.com/czy0729/Bangumi-Subject
Bangumi 人物靜態(tài)數(shù)據(jù)快照:https://github.com/czy0729/Bangumi-Mono(非必需)
Bangumi Data:https://github.com/bangumi-data/bangumi-data
字幕共享計(jì)劃:https://github.com/foxofice/sub_share
建立 Bangumi 數(shù)據(jù)庫(kù)所需代碼:https://github.com/Flinx-LY/Bangumi-Database
使用
bangumi_db.sql
在MySQL數(shù)據(jù)庫(kù)中建立數(shù)據(jù)表依次運(yùn)行 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
變量運(yùn)行三次)mysql_assFile.py
mysql_assDia.py
刪除
ass_dialogue
數(shù)據(jù)表的索引(加快導(dǎo)入速度)使用 Navicat 的導(dǎo)入功能導(dǎo)入
assDia
文件夾下csv文件至ass_dialogue
數(shù)據(jù)表重建
ass_dialogue
數(shù)據(jù)表的索引(約需20分鐘)
數(shù)據(jù)表行數(shù)統(tǒng)計(jì)
bangumi__type2
:18757bangumi_ep
:217513bgm_character
:38692bgm_person__cv
:4428bgm-crt-cv
:82524ass_file
:59258ass_dialogue
:27770149

部分代碼介紹
Bangumi-Subject
ids.js
爬取 2020 年的動(dòng)畫(huà)條目、所有類型的排行榜上的條目、bangumi-data 里面的所有條目的ID,保存于
ids
spider.js
從
ids
讀取作品ID列表遍歷作品ID列表,使用API獲取及爬取對(duì)應(yīng)作品資料保存于
data
文件夾
spider-by-index.js
指定開(kāi)始ID和結(jié)束ID,生成作品ID列表
遍歷作品ID列表,使用API獲取及爬取對(duì)應(yīng)作品資料保存于
data
文件夾
cn.js
遍歷
data
中作品資料文件,讀取作品的中文名稱保存于cn
文件夾
rate.js
遍歷
data
中作品資料文件,讀取作品的評(píng)分保存于cn
文件夾
Bangumi-Mono
spider.js
從
Bangumi-Subject/ids
讀取作品ID列表遍歷作品ID列表,從
Bangumi-Subject/data
讀取對(duì)應(yīng)作品資料文件中角色I(xiàn)D或人物ID列表遍歷角色I(xiàn)D或人物ID列表,爬取對(duì)應(yīng)角色資料保存于
data
文件夾或人物資料保存于person
文件夾
cv.js
遍歷
data
中角色資料文件,從中讀取聲優(yōu)ID列表遍歷聲優(yōu)ID列表,爬取對(duì)應(yīng)聲優(yōu)資料保存于
person
文件夾
Bangumi-Database
spider_crt.js
遍歷
Bangumi-Mono/data
中角色資料文件,建立角色I(xiàn)D列表(已緩存,無(wú)需Bangumi-Mono/data
)遍歷角色I(xiàn)D列表,爬取對(duì)應(yīng)角色資料保存于
crt
文件夾
Bangumi-Mono/spider.js
沒(méi)有考慮到一個(gè)角色可能有多個(gè)聲優(yōu)為其配音,故在其代碼基礎(chǔ)上加以修改。
例子:https://bgm.tv/character/44166
spider_cv.js
遍歷
crt
中角色資料文件,從中讀取聲優(yōu)ID列表遍歷聲優(yōu)ID列表,爬取對(duì)應(yīng)聲優(yōu)資料保存于
cv
文件夾
spider_bcc.js
從
Bangumi-Subject/ids
讀取作品ID列表遍歷作品ID列表,爬取對(duì)應(yīng)作品ID-角色I(xiàn)D-聲優(yōu)ID關(guān)系表保存于
bcc
文件夾
mysql_subject&ep.js
遍歷
Bangumi-Subject/data
中作品資料文件讀取作品信息插入到
bangumi__type2
數(shù)據(jù)表讀取章節(jié)信息插入到
bangumi_ep
數(shù)據(jù)表
由于Bangumi-Subject/data
中的部分json文件在保存時(shí)沒(méi)有對(duì)英文引號(hào)進(jìn)行處理,導(dǎo)致它們的json解析會(huì)失敗,故使用如下代碼在首次失敗后進(jìn)行正則替換再次解析。
mysql_bgmdata.js
遍歷
bangumi-data/data/items
中每月作品資料文件讀取官網(wǎng)和開(kāi)始日期更新
bangumi__type2
數(shù)據(jù)表
mysql_cn.js
讀取
Bangumi-Subject/cn/data.json
中作品中文名稱對(duì)照表遍歷中文名稱對(duì)照表,讀取中文名稱更新
bangumi__type2
數(shù)據(jù)表
mysql_bcc,crt,cv.js
遍歷
bcc
或crt
或cv
文件夾中文件讀取信息插入到
bgm-crt-cv
或bgm_character
或bgm_person__cv
數(shù)據(jù)表
本文件需要運(yùn)行三次,請(qǐng)更改indAction
變量分別完成以上三項(xiàng)工作
mysql_assFile.py
遍歷
sub_share/subs_list/animation
中字幕文件使用正則表達(dá)式從文件路徑中獲取字幕與作品的關(guān)聯(lián)信息,插入到
ass_file
數(shù)據(jù)表
mysql_assDia.py
遍歷
sub_share/subs_list/animation
中字幕文件從
ass_file
數(shù)據(jù)表中查詢ass文件ID將臺(tái)詞的文本內(nèi)容、時(shí)間連同ass文件ID保存至
assDia
文件夾下多個(gè)csv文件中,每個(gè)含100萬(wàn)行此后使用 Navicat 的導(dǎo)入功能導(dǎo)入csv文件至
ass_dialogue
數(shù)據(jù)表
簡(jiǎn)要說(shuō)明
在Bangumi-Subject/data
文件夾下有30萬(wàn)條json格式的Bangumi條目數(shù)據(jù)。
如果使用MongoDB數(shù)據(jù)庫(kù),則執(zhí)行如下這樣的node.js代碼即可直接導(dǎo)入json數(shù)據(jù)。
我使用了MySQL數(shù)據(jù)庫(kù),故需要設(shè)計(jì)表的結(jié)構(gòu)以處理數(shù)組對(duì)象、子Object對(duì)象和一對(duì)多、多對(duì)多關(guān)系。
其關(guān)鍵是bgm-crt-cv
關(guān)系表,因?yàn)?span id="s0sssss00s" class="md-pair-s " style="">作品-角色、角色-聲優(yōu)均為多對(duì)多關(guān)系。
而作品-劇集是一對(duì)多關(guān)系,只需在bangumi_ep
劇集數(shù)據(jù)表設(shè)置一個(gè)B_bangumi_id
字段指向作品數(shù)據(jù)表ID即可,B_
前綴指明這是一對(duì)多關(guān)系。
注:ass_file
數(shù)據(jù)表的R_bangumi_id
字段中的R_
前綴表明這一字段的數(shù)據(jù)可以查詢獲得,為簡(jiǎn)化操作而保存于此。
[未完,待補(bǔ)充]

MySQL查詢示例
按名稱查詢作品

按名稱和開(kāi)始日期查詢作品


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

搜索名字中含有“昴”的角色
問(wèn)題來(lái)源:https://www.bilibili.com/bangumi/play/ss6306
由于主要使用動(dòng)畫(huà)作品相關(guān)資料建立數(shù)據(jù)庫(kù),故查詢結(jié)果不全

搜索名字中含有“昴”的角色及其出場(chǎng)作品

搜索名字中含有“昴”的角色及其聲優(yōu)

搜索“沒(méi)有什么好怕的了”這一臺(tái)詞的出現(xiàn)過(guò)的劇集及時(shí)間
注:部分作品字幕有多個(gè)版本,查詢結(jié)果有重復(fù)


