热门标签 | 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

 


推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 本文讨论了如何在dotnet桌面(Windows)应用程序中添加图标。作者提到可以使用dotnet命令行工具与resource.rc文件一起使用来为标准.NET核心应用程序添加图标。作者还介绍了在创建控制台应用程序时如何编辑projeto1.csproj文件来添加图标。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
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社区 版权所有