作者:让安丷全筑起心灵的屏障 | 来源:互联网 | 2023-12-14 20:44
本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。
https://www.bilibili.com/anime/index/
单页数据接口, 用于获取单页数据
let url = `https://api.bilibili.com/pgc/season/index/result?season_version=-1&area=-1&is_finish=-1©right=-1&season_status=-1&season_mOnth=-1&year=-1&style_id=-1&order=3&st=1&sort=0&page=${++n}&season_type=1&pagesize=20&type=1
番剧数据接口, 获取番剧评分数据
https://api.bilibili.com/pgc/review/user?media_id=22718131
{
"media": {
"areas": [{ "id": 2, "name": "日本" }],
"cover": "http://i0.hdslb.com/bfs/bangumi/9d9cd5a6a48428fe2e4b6ed17025707696eab47b.png",
"media_id": 22718131,
"new_ep": { "id": 267876, "index": "26", "index_show": "全26话" },
"rating": { "count": 299753, "score": 9.8 },
"season_id": 26801,
"share_url": "https://www.bilibili.com/bangumi/media/md22718131",
"title": "鬼灭之刃",
"type_name": "番剧"
}
}
爬取每部番剧数据
const axios = require("axios")
const {outputJsonSync} = require("fs-extra")
const path = require("path")
const root = "d:/data/B站番剧"
async function* getPage() {
let n = 0
let data
do {
let url = `https://api.bilibili.com/pgc/season/index/result?season_version=-1&area=-1&is_finish=-1©right=-1&season_status=-1&season_mOnth=-1&year=-1&style_id=-1&order=3&st=1&sort=0&page=${++n}&season_type=1&pagesize=20&type=1`
let resp = await axios.get(url)
data = resp.data.data
// {
// code: 0,
// data: {
// has_next: 1,
// list: [ {
// "badge": "",
// "badge_type": 0,
// "cover": "http://i0.hdslb.com/bfs/bangumi/4eaaa8acecb52f1b400e88aa0df96a09a0947908.jpg",
// "index_show": "全51话",
// "is_finish": 1,
// "link": "https://www.bilibili.com/bangumi/play/ss5641",
// "media_id": 28221005,
// "order": "537追番",
// "order_type": "fav_count",
// "season_id": 5641,
// "title": "决斗大师VSR",
// "title_icon": ""
// },]
// }
// }
// console.log(data)
yield data.list
} while (data.has_next)
}
async function main() {
let g = getPage()
for await (let list of g) {
for (let data of list) {
let {title, media_id} = data.title
let p = path.join(root, media_id + "_" + title + ".json")
console.log(p)
outputJsonSync(p, data)
}
}
}
main()
爬取每部番剧评分数据
const globby = require("globby");
const path = require("path")
const axios = require("axios")
const {outputJsonSync, pathExistsSync, readJsonSync} = require("fs-extra")
const root = "d:/data/B站番剧"
async function main() {
let res = await globby(root + "/**/*.json")
for (let filePath of res) {
if (filePath.includes("rate"))
continue
let js = readJsonSync(filePath)
let media_id = js.media_id
let name = path.basename(filePath).split(".json")[0]
let dir = path.dirname(filePath)
let p = path.join(dir, name + "_" + "rate" + ".json")
if (pathExistsSync(p) || !media_id) {
if (!media_id)
console.log("media_id", media_id)
continue
}
let url = `https://api.bilibili.com/pgc/review/user?media_id=${media_id}`
let resp = await axios.get(url)
outputJsonSync(p, resp.data.result)
}
}
main()
按照评分和人数排序
const globby = require("globby");
const {readJsonSync} = require("fs-extra")
const root = "d:/data/B站番剧"
async function main() {
let res = await globby(root + "/**/*.json")
res
.filter(i => i.includes("rate"))
.map(
i => readJsonSync(i)
)
.filter(
i => i.media && i.media.rating && i.media.rating.score
)
.sort(
(a, b) => {
let ar = a.media.rating
let br = b.media.rating
if (ar.score !== br.score)
return b.media.rating.score - a.media.rating.score
return br.count - ar.count
}
)
.map(
i => `<<${i.media.title}>> ${i.media.rating.score} ${i.media.rating.count}`
)
.slice(0, 100)
.forEach(i => console.log(i))
}
main()
前100部
<<异度侵入 ID:INVADED>> 9.9 125285
<<青春猪头少年不会梦到怀梦美少女>> 9.9 94493
<<擅长捉弄的高木同学 第二季>> 9.9 87940
<<钢之炼金术师 FULLMETAL ALCHEMIST>> 9.9 66085
<<路人超能100 II(灵能百分百 第二季)>> 9.9 61324
<<游戏人生 零>> 9.9 47289
<<强风吹拂>> 9.9 45338
<<轻音少女 第一季>> 9.9 36610
<> 9.9 32608
<> 9.9 31746
<<妖精森林的小不点>> 9.9 31725
<> 9.9 29135
<<轻音少女 剧场版>> 9.9 27506
<<轻音少女 第二季>> 9.9 26250
<<猫和老鼠 旧版>> 9.9 25934
<> 9.9 24062
<<家庭教师HITMAN REBORN!>> 9.9 22293
<<高分少女 第二季>> 9.9 21263
<<犬夜叉>> 9.9 21180
<<俺物语!!>> 9.9 20799
<<排球少年!!>> 9.9 13055
<<魔法少女小圆 剧场版 [新篇] 叛逆的物语>> 9.9 12296
<<吹响吧!上低音号~誓言的终章~>> 9.9 10424
<<夏目友人帐>> 9.9 9418
<<哆啦A梦>> 9.9 8388
<<吹响吧!上低音号 第二季>> 9.9 8289
<<虫师>> 9.9 7781
<<犬夜叉完结篇>> 9.9 6044
<<哆啦A梦 第一季>> 9.9 1020
<<鬼灭之刃>> 9.8 299753
<> 9.8 196620
<<辉夜大小姐想让我告白~天才们的恋爱头脑战~>> 9.8 176165
<<青春猪头少年不会梦到兔女郎学姐>> 9.8 107951
<<革命机Valvrave>> 9.8 90951
<> 9.8 58778
<<女高中生的虚度日常>> 9.8 56418
<> 9.8 55586
<<碧蓝之海>> 9.8 55546
<<约定的梦幻岛>> 9.8 55026
<<少女终末旅行>> 9.8 54816
<<刀剑神域>> 9.8 53395
<<冰海战记>> 9.8 50635
<<宝石之国>> 9.8 50403
<<卫宫家今天的饭>> 9.8 43701
<<魔卡少女樱 CLEAR CARD篇>> 9.8 42431
<> 9.8 41616
<> 9.8 41408
<<冰菓>> 9.8 40681
<<天使降临到我身边>> 9.8 38565
<<某科学的超电磁炮T>> 9.8 35964
<<齐木楠雄的灾难 第二季>> 9.8 31832
<<四月是你的谎言>> 9.8 31278
<<比宇宙更远的地方>> 9.8 30951
<<你的名字。>> 9.8 30874
<<齐木楠雄的灾难 始动篇>> 9.8 29694
<<月刊少女野崎君>> 9.8 29178
<> 9.8 28006
<<文豪野犬 第三季>> 9.8 26946
<<幻界战线 & BEYOND>> 9.8 26843
<<月色真美>> 9.8 26462
<<街角魔族>> 9.8 25880
<<日常>> 9.8 25827
<<剧场版 中二病也要谈恋爱! -Take On Me->> 9.8 24187
<<我的青春恋爱物语果然有问题。 续>> 9.8 23749
<<此花亭奇谭>> 9.8 23578
<<终将成为你>> 9.8 22817
<<少女☆歌剧 Revue Starlight>> 9.8 21568
<<男子高中生的日常>> 9.8 21232
<<魔法少女小圆>> 9.8 19781
<<斩服少女>> 9.8 19637
<<灰与幻想的格林姆迦尔 >> 9.8 19332
<<龙珠超:布罗利>> 9.8 15545
<<流汗吧!健身少女>> 9.8 15354
<<3月的狮子 第二季>> 9.8 13934
<<進擊的巨人 第三季 Part.2(僅限台灣地區)>> 9.8 13505
<<玉子爱情故事>> 9.8 13374
<<玉子市场>> 9.8 12961
<<会长是女仆大人!>> 9.8 12631
<<百变小樱>> 9.8 12377
<<邻家索菲>> 9.8 12248
<<齐木楠雄的灾难 完结篇>> 9.8 11020
<<神推偶像登上武道馆我就死而无憾>> 9.8 10433
<<路人超能100 第一次灵能咨询所员工旅游~舒缓心灵的疗愈之旅~(OVA2)>> 9.8 10421
<<索玛丽与森林之神>> 9.8 9969
<<吹响吧!上低音号>> 9.8 9230
<<怪化猫>> 9.8 8719
<<黑执事>> 9.8 8588
<<夏目友人帐 陆>> 9.8 8515
<<恋爱小行星>> 9.8 8135
<<狼与香辛料>> 9.8 8096
<<剧场版 悠哉日常大王 Vacation>> 9.8 7871
<<企鹅公路>> 9.8 7461
<<欢迎光临樱兰高校>> 9.8 7429
<<夏目友人帐>> 9.8 7417
<<幸运星>> 9.8 7315
<<乒乓>> 9.8 7239
<> 9.8 7230
<<玛纳利亚的密友(Mysteria Friends)/巴哈姆特之怒/玛娜利亚魔法学院>> 9.8 6849
<<重启咲良田>> 9.8 6775
<<3月的狮子>> 9.8 6548
Process finished with exit code 0