menu FlyingSky's Blog
观测者:数据爬虫与处理,历史数据可视化视频与用户排名
October 2nd, 2020   随笔 项目   3 条评论   1406 次阅读

以一篇文章,记录这三个月来的数据处理与数据可视化的入门。本文主要讲些技术向内容,但或许会穿插一些奇奇怪怪的东西(事实上,整篇文章都很奇怪)。

BiliOB 观测者 是一个搜集并观测 B 站的 UP 主、视频或番剧等数据的网站。2019 年,我在这个网站上注册了账号。作为一个由个人创建并维护的网站,为了防止被滥用,就有了用户积分来限制操作数,随之而来的功能则是:「用户经验」与「排行榜」。

逐渐的,随着「观测者预测」功能的开发,积分与经验有了新的作用——娱乐。确实,闲来无事看着网站上数据的变化,一条条「观测记录」,还挺不错的,至少对于我这种无聊的人来说。

曾在「观测者排行」的「观测记录」里看到过有人提出观测该排行的操作(BiliOB 观测者观测者),还挺有趣的(给我也整一个!咕)。今年暑假,我就决定以它为数据,试手历史数据的处理与可视化,然后挖了一个大坑

爬虫

这个网站是前后端分离的,「观测者排行」的后端 API 不需要登录就能访问。所以,这种事情还不简单吗,定时任务 curl 上!

对了,这个网站是有反爬虫机制的,源码 GitHub 开源,我曾大致研究过,但是我真不会Java,看得迷迷糊糊的。

处理

对于我来说,最顺手的工具就是 PHP 了。这里需要处理的数据并不复杂,目前我写的这工具用起来还是挺香的。

[email protected] 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 联动 ffmpegPIL 将视频封面的制作也自动化了(全流程自动化指日可待,「自动化狂魔」雾)。

这两个月里,为实现上述的数据处理可视化等,我折腾了不少技术,也写了些许代码,目前全部放在 BiliOB-Watcher 这个 repo 里。现在它是 private repo,如果有哪位有需要,对技术细节有兴趣的话,我会考虑开源的。

排行榜

话说回来,动手把这篇文章给写了,主要还是因为今天见齐把一位开小号刷经验的观测者给揭了。嘛其实我做「2020 年新观测者的排行榜」这东西的动机很明显啊,想知道各位观测者「冲分」是多么得猛(啊有段时间我也经常改名来着)。

那么,观测了两个半月的排行榜,这些观测者有多猛呢?我做了个图表,数据筛选条件如下:

  • 2020-07-15 19h 到 2020-10-02 20h
  • 2020 年新观测者(FlyingSky 除外)
  • 所有经验增量超过「每日 3 签(最多得到 60 经验)」的 95% 的

chart.png

竖线表示在此之前不位于前 100 内,好看吗,好看就是好图表。

目前我能想到的内容就这些,有些许困了...顺带附上截止 2020-10-02 20h 的数据文件 ranklist.zip

发表评论
已有 3 条评论
textsms
account_circle
email
link
    Z
    Z
    February 10th, 2021 at 15:32

    博客上线906天,现在的同学也太优秀了

    --阳光咕--
    --阳光咕--
    October 3rd, 2020 at 17:55

    写的不错!

      gugu
      gugu
      November 29th, 2020 at 15:18

      加油