数据来源:metacritic games 的排行页,所有平台、所有时间,因为多线程关系数据顺序是乱的,影响不大,一条查询语句就能重得排序。爬虫实现使用 jsoup,数据分析使用 plotly

如标题所言,我并没有数据分析的经验和知识,所以只用 SQL 语句返回的结果和一些图表来瞎做总结,这些代码其实也是今年 Java 课设交的作业。另外作为一名混乱邪恶的游戏玩家,所得分析和总结可能会带有个人情绪。有问题的地方还请大佬们指出,谢谢。

环境

  • JDK version: 10.0.2
  • 依赖库:jsoup, mybatis, Codec
  • MySQL version: 8.0
  • Falcon SQL Client
  • 运行 & 测试环境环境:Ubuntu 18.04, macOS High Sierra, Windows 1803

背景

Java 课设老师给了好几个课题,比如网盘、五子棋啥的,还有一个任务就是爬取豆瓣电影 top250,我初选的课题是网盘,可后来因为客户端和服务端的一些问题一直和同学争执(比如服务端要不要 gui、秒传、通信之类的),吵得脑壳痛的同时干脆把自己的题目换成了爬虫,虽然老师钦点了要爬豆瓣电影 top250,但自己更想爬 metacritic 的游戏信息,也更符合自己的兴趣。

至于数据分析,初期我完全没头绪,从数据库导出了个 csv 就准备用 MS Office Excel 画图表。后来莫名其妙碰上了 plotly,这玩意相当易用,于是就拿这个 xjb 画图了。遗憾我 python 不行,所以用了官方推荐的 Falcon SQL Client(发出偷懒的声音.jpg

爬取数据

浏览 Metacritic 的页面就能基本了解需要获得的一些信息:游戏名、媒体综合评分、发行日期、分级、发行商、分类、用户评分和平台。其中让我们了解一款游戏素质的媒体均分和用户评分是非常重要的两项数据,遗憾的是由于有些游戏无人问津所以用户评分是空,数据库中我用了 -1 来代替,

数据爬取其实非常简单,只要懂 Java 会看 jsoup 文档并有 HTML 基础就能开始,Chrome 审查元素获得需要的信息,之后 jsoup 一路 select() 就完事了。可以开多个线程进行爬取,也不要太激进,不然被服务器分分钟 ban 掉…没有手写 JDBC,用了 mybatis,参考其文档就能明白其基本用法了(我也只知道它的基本用法),这次的表设计比较匆忙,直接把所有的数据都丢一张表上,而且主键还用了比较脑残地用了 MD5,imgUrl 那一项可以不管,是封面链接,我为了省时间其实也只下了两百张…

数据截止 2018 年 7 月 22 日,总数据 15431 条,用户评分有效数据(非 -1)14045 条,分类非空数据 12335 条,发行商信息非空数据 15424 条,分级非空数据 14143 条。

分析数据(图表整理中)

没想到吧,我又摸了!

总结

  1. 数据库设计得非常蠢,所有数据全堆在一张表上,需要做分解和优化以满足范式。
  2. 主键的设计也很傻,特意引入了一个 Codec 库把 name + platform + releaseDate 字符串转成 md5 来做主键,空间占用大效率也差…后来经别人提示可以用自增主键,nice idea。
  3. 想用 python 再爬一遍…
  4. 数据分析做的一塌糊涂,有空想要自学下这方面的知识,尤其想摆脱 Falcon SQL Client 这种工具,自己写代码。
  5. 我觉得自己的概率论和线代要重学…
  6. 关于反爬机制需要有更多了解,python 这方面有很多参考和轮子,jsoup 文档也有关于代理和 agent 的说明。

题外话

因为前期测试无节制发请求我的校园网 ip 被 metacritic ban了…获得最终结果前换了好几次代理,玩坏了裙主的好几个 ip,当然后面都解封了,希望没有给那时使用相同 ip 且恰好有访问 metacritic 需求的用户造成麻烦…