nodejs 爬取b站番剧数据, 计算最佳追番推荐

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&copyright=-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&copyright=-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
<<CLANNAD ~AFTER STORY~>>	9.9	32608
<<JOJO的奇妙冒险  星尘远征军>>	9.9	31746
<<妖精森林的小不点>>	9.9	31725
<<JOJO的奇妙冒险 星尘远征军 埃及篇>>	9.9	29135
<<轻音少女 剧场版>>	9.9	27506
<<轻音少女 第二季>>	9.9	26250
<<猫和老鼠 旧版>>	9.9	25934
<<ReLIFE 完结篇>>	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
<<JOJO的奇妙冒险 黄金之风>>	9.8	196620
<<辉夜大小姐想让我告白~天才们的恋爱头脑战~>>	9.8	176165
<<青春猪头少年不会梦到兔女郎学姐>>	9.8	107951
<<革命机Valvrave>>	9.8	90951
<<JOJO的奇妙冒险 不灭钻石>>	9.8	58778
<<女高中生的虚度日常>>	9.8	56418
<<Megalo Box>>	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
<<NO GAME NO LIFE 游戏人生>>	9.8	41616
<<JOJO的奇妙冒险>>	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
<<CLANNAD>>	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
<<Re:从零开始的异世界生活 Memory Snow(雪之回忆)>>	9.8	7230
<<玛纳利亚的密友(Mysteria Friends)/巴哈姆特之怒/玛娜利亚魔法学院>>	9.8	6849
<<重启咲良田>>	9.8	6775
<<3月的狮子>>	9.8	6548

Process finished with exit code 0