热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本文介绍了如何使用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©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

 


推荐阅读
  • 利用 Gmail API 实现 Node.js 定时自动发送邮件功能
    功能:利用Node每天定时发送邮件给指定邮箱。需要的npm包:nodemailernode-schedule实现步骤:配置nodemailer发送邮件开启定时邮件发送 ... [详细]
  • 通过移除单一数字优化数据集 ... [详细]
  • 本文旨在构建一个JavaScript函数,用于对用户输入的电子邮件地址和密码进行有效性验证。该函数将确保输入符合标准格式,并检查密码强度,以提升用户账户的安全性。通过集成正则表达式和条件判断语句,该方法能够有效防止常见的输入错误,同时提供即时反馈,改善用户体验。 ... [详细]
  • 本文将详细介绍如何利用JMeter高效执行API接口测试,涵盖JMeter的基础介绍、安装方法、中文环境配置、主要元件及其作用域和执行顺序等内容,并分享一系列实用的测试技巧,帮助读者全面掌握JMeter接口测试的全过程。 ... [详细]
  • Python初学者入门指南:从基础到实践的全面学习路径本文为Python初学者提供了一条从基础到实践的全面学习路径。特别介绍了Python字典(Dictionary)中的`items()`方法,该方法用于返回字典中所有键值对的视图对象,便于在循环和其他操作中使用。通过实例讲解,帮助读者更好地理解和应用这一重要功能。 ... [详细]
  • 综合实训 201521440015
    Chinesepeople’publicsecurityuniversity网络对抗技术实验报告实验五综合渗透学生姓名常泽远年级15区队4指导教师高见信息技术与网络安全学院2018 ... [详细]
  • 前言: 网上搭建k8s的文章很多,但很多都无法按其说明在阿里云ecs服务器成功搭建,所以我就花了些时间基于自己成功搭建k8s的步骤写了个操作手册,希望对想搭建k8s环境的盆友有所帮 ... [详细]
  • 无法将文件下载到AWSLambda ... [详细]
  • SuperMap iClient3D for WebGL教程:深入解析影像图层(ImageryLayer)的应用与优化
    本文详细探讨了 SuperMap iClient3D for WebGL 中影像图层(ImageryLayer)的应用与优化技巧。通过多个实际案例,作者深入解析了不同类型的 ImageryProvider 的使用方法,并提供了实用的性能优化建议,帮助开发者更好地在三维场景中展示和管理影像数据。 ... [详细]
  • 深入掌握 React Hooks,让你的应用开发如虎添翼
    本文首发于政采云前端团队博客,详细探讨了 React Hooks 的核心概念与实用技巧。通过深入解析常见 Hooks 的使用场景和高级用法,帮助开发者在实际项目中更加灵活高效地运用 React Hooks,提升应用开发效率和代码可维护性。无论是初学者还是有经验的开发者,都能从中获得宝贵的知识和实践经验。 ... [详细]
  • 如何高效地压缩JavaScript代码以提升网页性能
    本篇内容介绍了“javascript如何压缩”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处 ... [详细]
  • 在PB数据窗口中,错误处理技术主要针对两类问题进行优化:一是由用户不当数据输入引发的错误,二是程序执行过程中因代码缺陷导致的异常。高效的应用程序设计需确保无论出现哪种类型的错误,系统都能有效应对,保证稳定性和用户体验。通过引入先进的错误检测与恢复机制,可以显著提升系统的健壮性和可靠性。 ... [详细]
  • Panabit应用层流量管理解决方案
    Panabit是一款国内领先的应用层流量管理解决方案,提供高度开放且免费的专业服务,尤其擅长P2P应用的精准识别与高效控制。截至2009年3月25日,该系统已实现对多种网络应用的全面支持,有效提升了网络资源的利用效率和安全性。 ... [详细]
  • c#学Java–Java基本语法1.类比JAVA .NETJVM CLRJDK  FCL2.java命名约定类名称应以大写字母开头,并成为容易理解的名词或组合。如 ... [详细]
  • 一.问题汇总:折线图问题与解决折线图中的多条折线,怎么设置?怎么设置echarts的背景颜色?怎么设置X轴,Y ... [详细]
author-avatar
让安丷全筑起心灵的屏障
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有