起因

事情是这样的。

有天晚上我在 B 站游戏中心闲逛,发现有些游戏明明评分很高,但下载量很低。有些游戏评分一般,下载量却很高。

我就想,这些数据之间有没有什么规律?

于是我就写了这个爬虫。

项目简介

这个项目干的事情很简单:爬取 B 站游戏中心的数据,然后做分析和可视化。

爬取的数据包括:游戏名称、类型、平台、评分、关注数、下载量、排行榜数据等等。

分析的内容包括:类型分布、平台分布、评分分布、关注数与下载量的关系、流水估算等等。

数据获取模式

项目支持三种数据获取模式:

模式 说明 适用场景
demo 内置 88 款真实国产游戏的模拟数据 开发调试、离线演示
web 从 B 站游戏中心 HTML 页面解析 实际数据采集
api 调用 B 站 API 接口 实际数据采集

demo 模式是给那些不想爬数据、只想看看分析效果的人准备的。内置了 88 款真实国产游戏的数据,虽然不是最新的,但足够演示用了。

web 模式是通过解析 HTML 页面获取数据,不需要 API key,但速度慢一点。

api 模式是直接调用 B 站的 API,速度快,但可能需要处理反爬。

流水估算

这个项目最有意思的部分是流水估算。

B 站游戏中心不公布游戏的收入数据,所以我只能通过其他指标来估算。我用的指标是关注数和评分。

关注数代表游戏的热度,评分代表游戏的质量。热度高质量好的游戏,收入大概率不会差。

估算的公式很简单:流水 = 关注数 * 评分系数 * 平台系数。这个公式不精确,但能看出大概的趋势。

可视化

项目会生成 7 种图表:

  1. 游戏类型分布饼图
  2. 平台分布柱状图
  3. 评分分布直方图
  4. 关注数与下载量散点图
  5. 流水估算排名图
  6. 热度榜 TOP10
  7. 畅销榜 TOP10

这些图表用 Matplotlib 生成,样式一般,但数据是准的。如果你想要好看的图表,可以自己换 ECharts 或者 Plotly。

一些发现

爬完数据之后,我发现了一些有意思的事:

  1. 二次元游戏的评分普遍偏高。 可能是因为二次元玩家更愿意打高分。

  2. 独立游戏的关注数和下载量不成正比。 有些独立游戏关注数很高,但下载量很低。可能是因为玩家只是收藏了,没有真正去玩。

  3. B 站游戏中心的热门游戏和 App Store 的热门游戏不太一样。 B 站用户更偏好二次元、独立、小众的游戏。

  4. 预约榜的游戏,上线后的表现参差不齐。 预约数高不代表游戏质量好,可能只是营销做得好。

这些发现不算什么深刻的洞察,但对我来说挺有意思的。

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bgame/
├── main.py # 主入口
├── bili_game_scraper/ # 爬虫模块
│ ├── spider.py # 爬虫引擎
│ ├── demo_data.py # 模拟数据生成器
│ └── parsers/ # 解析器
├── analysis/ # 分析模块
│ ├── statistics.py # 统计分析
│ └── visualization.py # 可视化
├── storage/ # 存储模块
│ └── sqlite_storage.py # SQLite 存储
├── scheduler/ # 调度模块
│ └── scheduler.py # 定时调度
├── config/ # 配置模块
│ └── settings.py # 配置管理
├── data/ # 数据目录
├── charts/ # 图表目录
└── exports/ # 导出目录

快速开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装依赖
pip install -r requirements.txt

# 一键执行完整流程:爬取→分析→可视化→导出
python main.py all

# 只爬取数据
python main.py crawl --max-pages 5

# 只生成分析报告
python main.py analyze --save

# 只生成可视化图表
python main.py visualize

# 启动定时爬取
python main.py schedule --interval 6

踩过的坑

坑一:反爬

B 站有反爬机制,请求太频繁会被封 IP。我加了随机延时和 User-Agent 轮换,但有时候还是会被封。

坑二:数据格式

B 站游戏中心的数据格式不太统一,有些游戏的字段是空的,有些游戏的字段格式不一样。我写了好几个解析器来处理这些特殊情况。

坑三:分页

B 站游戏中心的分页逻辑有点奇怪,有时候请求第一页会返回重复的数据。我加了去重逻辑,才解决这个问题。

开源

项目地址:yfgug/bgame

如果你对 B 站游戏数据感兴趣,可以玩玩看。代码写得一般,但功能是完整的。

写在最后

这个项目是我用来练手 Python 爬虫的。写完之后发现,爬虫这东西,技术上不难,难的是处理各种边界情况。

反爬、数据格式、分页、编码……每个环节都可能出问题。写爬虫就像是在和网站的开发者斗智斗勇,有时候赢,有时候输。

但最后爬下来的数据,确实能发现一些有意思的东西。

这大概就是数据的魅力吧。

“数据是新时代的石油,分析是炼油厂。”