以一篇文章,记录这三个月来的数据处理与数据可视化的入门。本文主要讲些技术向内容,但或许会穿插一些奇奇怪怪的东西(事实上,整篇文章都很奇怪)。
序
BiliOB 观测者 是一个搜集并观测 B 站的 UP 主、视频或番剧等数据的网站。2019 年,我在这个网站上注册了账号。作为一个由个人创建并维护的网站,为了防止被滥用,就有了用户积分来限制操作数,随之而来的功能则是:「用户经验」与「排行榜」。
逐渐的,随着「观测者预测」功能的开发,积分与经验有了新的作用——娱乐。确实,闲来无事看着网站上数据的变化,一条条「观测记录」,还挺不错的,至少对于我这种无聊的人来说。
曾在「观测者排行」的「观测记录」里看到过有人提出观测该排行的操作(BiliOB 观测者观测者),还挺有趣的(给我也整一个!咕)。今年暑假,我就决定以它为数据,试手历史数据的处理与可视化,然后挖了一个大坑。
爬虫
这个网站是前后端分离的,「观测者排行」的后端 API 不需要登录就能访问。所以,这种事情还不简单吗,定时任务 curl
上!
对了,这个网站是有反爬虫机制的,源码 GitHub 开源,我曾大致研究过,但是我真不会Java,看得迷迷糊糊的。
处理
对于我来说,最顺手的工具就是 PHP 了。这里需要处理的数据并不复杂,目前我写的这工具用起来还是挺香的。
FlyingSky@Utopianor MINGW64 /d/GitHub/BiliOB-Watcher/userRank (master)
$ php compute.php
[2020-10-02 13:28:28] coumpute Running.
[2020-10-02 13:28:28] zip Unarchiving 'ranklist.zip'.
[2020-10-02 13:28:28] csv Reading 'full-ranklist.json'.
[2020-10-02 13:28:28] json Saving 'ranklist.json'.
[2020-10-02 13:28:28] raw Turning 'full-ranklist.json' into 'ranklist.json'.
[2020-10-02 13:28:28] coumpute Constructing.
[2020-10-02 13:28:28] csv Reading 'ranklist.json'.
[2020-10-02 13:28:28] watcher BiliOB-Watcher constructed.
[2020-10-02 13:28:28] watcher Loading 21000 items.
[2020-10-02 13:28:28] watcher genHash.
[2020-10-02 13:28:28] watcher limitTime from 1596240000 to 1597017600.
[2020-10-02 13:28:28] watcher limitPerDay at 8.
[2020-10-02 13:28:28] watcher formatDate.
[2020-10-02 13:28:28] csv Saving 'comp-rank-0.csv'.
[2020-10-02 13:28:28] csv Saving 'comp-rank-1.csv'.
[2020-10-02 13:28:28] csv Saving 'comp-rank-2.csv'.
[2020-10-02 13:28:28] csv Saving 'comp-rank-3.csv'.
[2020-10-02 13:28:28] csv Saving 'comp-rank-4.csv'.
[2020-10-02 13:28:28] watcher dumpRank.
[2020-10-02 13:28:28] csv Saving 'comp-vary-0.csv'.
[2020-10-02 13:28:28] csv Saving 'comp-vary-1.csv'.
[2020-10-02 13:28:28] csv Saving 'comp-vary-2.csv'.
[2020-10-02 13:28:28] csv Saving 'comp-vary-3.csv'.
[2020-10-02 13:28:28] watcher dumpVary.
[2020-10-02 13:28:28] csv Saving 'comp-register.csv'.
[2020-10-02 13:28:28] watcher dumpRegister after 1577836800.
可视化
目前使用的可视化框架是 Historical-ranking-data-visualization-based-on-d3.js,同 BiliOB 是一个作者(Jannchie 见齐,也是 B 站上的一位数据可视化 UP 主)。
整个排行榜的可视化分成了 10 部分:
- 背景音乐可视化
- 排行榜变化(1~40 名)
- 排行榜变化(41~80 名)
- 排行榜变化(81~100 名)
- 经验变化榜(1~40 名)
- 经验变化榜(41~80 名)
- 2020 年新观测者的排行榜(前 20 名)
刚开始我为每个部分单独配置,每部分分开渲染然后剪辑在一起,剪了两期后(Demo 和 #1),我还是被繁琐枯燥重复的剪辑工作整暴躁了,花了一些时间封装了「数据可视化」和「音频(背景音乐)可视化」的代码,将所有内容丢到了一起,做成了一个播放器(你可以在 我是如何快速制作每一期可视化视频的?- Bilibili 的 00:52 秒看到这个东西的演示)。
项目
这些数据处理的最终成果就是我目前在 B 站上更新的「【BiliOB 观测者】用户排名观察」系列视频,目前的更新频率是半个月。前些天写了些代码,用 PHP 联动 ffmpeg
和 PIL
将视频封面的制作也自动化了(全流程自动化指日可待,「自动化狂魔」雾)。
这两个月里,为实现上述的数据处理可视化等,我折腾了不少技术,也写了些许代码,目前全部放在 BiliOB-Watcher 这个 repo 里。现在它是 private repo,如果有哪位有需要,对技术细节有兴趣的话,我会考虑开源的。
排行榜
话说回来,动手把这篇文章给写了,主要还是因为今天见齐把一位开小号刷经验的观测者给揭了。嘛其实我做「2020 年新观测者的排行榜」这东西的动机很明显啊,想知道各位观测者「冲分」是多么得猛(啊有段时间我也经常改名来着)。
那么,观测了两个半月的排行榜,这些观测者有多猛呢?我做了个图表,数据筛选条件如下:
- 2020-07-15 19h 到 2020-10-02 20h
- 2020 年新观测者(FlyingSky 除外)
- 所有经验增量超过「每日 3 签(最多得到 60 经验)」的 95% 的
竖线表示在此之前不位于前 100 内,好看吗,好看就是好图表。
尾
目前我能想到的内容就这些,有些许困了…顺带附上截止 2020-10-02 20h 的数据文件: