爬了 B 站游戏数据,发现了一些有意思的事
起因
事情是这样的。
有天晚上我在 B 站游戏中心闲逛,发现有些游戏明明评分很高,但下载量很低。有些游戏评分一般,下载量却很高。
我就想,这些数据之间有没有什么规律?
于是我就写了这个爬虫。
项目简介
这个项目干的事情很简单:爬取 B 站游戏中心的数据,然后做分析和可视化。
爬取的数据包括:游戏名称、类型、平台、评分、关注数、下载量、排行榜数据等等。
分析的内容包括:类型分布、平台分布、评分分布、关注数与下载量的关系、流水估算等等。
数据获取模式
项目支持三种数据获取模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
demo |
内置 88 款真实国产游戏的模拟数据 | 开发调试、离线演示 |
web |
从 B 站游戏中心 HTML 页面解析 | 实际数据采集 |
api |
调用 B 站 API 接口 | 实际数据采集 |
demo 模式是给那些不想爬数据、只想看看分析效果的人准备的。内置了 88 款真实国产游戏的数据,虽然不是最新的,但足够演示用了。
web 模式是通过解析 HTML 页面获取数据,不需要 API key,但速度慢一点。
api 模式是直接调用 B 站的 API,速度快,但可能需要处理反爬。
流水估算
这个项目最有意思的部分是流水估算。
B 站游戏中心不公布游戏的收入数据,所以我只能通过其他指标来估算。我用的指标是关注数和评分。
关注数代表游戏的热度,评分代表游戏的质量。热度高质量好的游戏,收入大概率不会差。
估算的公式很简单:流水 = 关注数 * 评分系数 * 平台系数。这个公式不精确,但能看出大概的趋势。
可视化
项目会生成 7 种图表:
- 游戏类型分布饼图
- 平台分布柱状图
- 评分分布直方图
- 关注数与下载量散点图
- 流水估算排名图
- 热度榜 TOP10
- 畅销榜 TOP10
这些图表用 Matplotlib 生成,样式一般,但数据是准的。如果你想要好看的图表,可以自己换 ECharts 或者 Plotly。
一些发现
爬完数据之后,我发现了一些有意思的事:
二次元游戏的评分普遍偏高。 可能是因为二次元玩家更愿意打高分。
独立游戏的关注数和下载量不成正比。 有些独立游戏关注数很高,但下载量很低。可能是因为玩家只是收藏了,没有真正去玩。
B 站游戏中心的热门游戏和 App Store 的热门游戏不太一样。 B 站用户更偏好二次元、独立、小众的游戏。
预约榜的游戏,上线后的表现参差不齐。 预约数高不代表游戏质量好,可能只是营销做得好。
这些发现不算什么深刻的洞察,但对我来说挺有意思的。
项目结构
1 | bgame/ |
快速开始
1 | # 安装依赖 |
踩过的坑
坑一:反爬
B 站有反爬机制,请求太频繁会被封 IP。我加了随机延时和 User-Agent 轮换,但有时候还是会被封。
坑二:数据格式
B 站游戏中心的数据格式不太统一,有些游戏的字段是空的,有些游戏的字段格式不一样。我写了好几个解析器来处理这些特殊情况。
坑三:分页
B 站游戏中心的分页逻辑有点奇怪,有时候请求第一页会返回重复的数据。我加了去重逻辑,才解决这个问题。
开源
项目地址:yfgug/bgame
如果你对 B 站游戏数据感兴趣,可以玩玩看。代码写得一般,但功能是完整的。
写在最后
这个项目是我用来练手 Python 爬虫的。写完之后发现,爬虫这东西,技术上不难,难的是处理各种边界情况。
反爬、数据格式、分页、编码……每个环节都可能出问题。写爬虫就像是在和网站的开发者斗智斗勇,有时候赢,有时候输。
但最后爬下来的数据,确实能发现一些有意思的东西。
这大概就是数据的魅力吧。
“数据是新时代的石油,分析是炼油厂。”