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

 


推荐阅读
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
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社区 版权所有