为啥突然想写这个?
前几天刷朋友圈,看到老张在晒黄河口马拉松的完赛奖牌,配文是“今年PB了,但查成绩查得差点把手机摔了”,我一看就乐了——这不就是典型的查询体验翻车现场嘛,黄河口马拉松作为国内知名的金牌赛事,每年参赛人数好几万,比赛一结束大家都急着查成绩,但官网有时候卡得像是在用拨号上网,所以我就在想,能不能用Go写个轻量的成绩查询工具?说干就干。
先搞明白:黄河口马拉松成绩查询到底查什么?
先别急着写代码,得知道我们要处理的数据长啥样,黄河口马拉松的成绩查询,通常需要输入参赛号或者姓名,然后返回:
- 枪声成绩(从发令枪响到你冲线的时间)
- 净成绩(从你踩过起点计时毯到你冲线的时间)
- 分段计时(每5公里的用时)
- 排名信息(总排名、性别排名、年龄组排名)
这些数据一般以JSON格式从赛事官网的API返回,比如一个典型的查询返回可能是:
{
"bib": "A1234",
"name": "张三",
"gun_time": "03:45:12",
"net_time": "03:42:08",
"splits": [
{"km": 5, "time": "00:25:10"},
{"km": 10, "time": "00:52:30"}
],
"rank_total": 1256,
"rank_gender": 980,
"rank_age": 45
}
用Golang写查询,到底比浏览器强在哪?
你可能要问了:我直接打开官网查不就行了?但实际情况是,马拉松比赛结束后的几小时内,官网流量会爆炸,尤其是黄河口马拉松这种参赛人数超过两万的大型赛事,服务器扛不住太正常了,用Go写个命令行工具或者小脚本的好处是:
- 轻量 —— 一个二进制文件,啥依赖都不用装
- 并发 —— Go的goroutine可以同时查询多个参赛者
- 缓存 —— 可以把查过的结果存本地,省得老去挤官网
我自己用Go写了一个小工具,核心逻辑就几十行代码,先定义一个结构体来存数据:
type MarathonResult struct {
Bib string `json:"bib"`
Name string `json:"name"`
GunTime string `json:"gun_time"`
NetTime string `json:"net_time"`
RankTotal int `json:"rank_total"`
RankGender int `json:"rank_gender"`
RankAge int `json:"rank_age"`
}
然后发一个HTTP GET请求,把参赛号拼到URL里,黄河口马拉松的API地址一般长这样:https://api.huanghekou-marathon.com/result/{bib},用Go的net/http包发请求,解析JSON,打印出来,完事。
实战:一次真实的查询过程
我拿老张的参赛号B5678试了一次,代码跑起来,控制台输出:
查询参赛号: B5678
姓名: 张伟
枪声成绩: 04:12:33
净成绩: 04:08:15
总排名: 2345/15000
性别排名: 1890/9800
年龄组排名: 234/1200
分段:
5km: 00:28:10
10km: 00:56:45
半程: 01:59:30
30km: 02:58:20
全程: 04:08:15
说实话,看到这个分段数据,我愣了一下——前半程跑得太猛了,后半程明显掉速,这其实就是查成绩的隐藏价值:不只是看个结果,还能分析自己的比赛策略。

怎么让查询结果更有用?
光显示时间还不够,我用Go加了个小功能——对比往届成绩,黄河口马拉松我跑了三年,把去年的净成绩04:15:22和今年的04:08:15一对比,进步了7分多钟,Go的time包算差值很方便:
lastYear, _ := time.Parse("15:04:05", "04:15:22")
thisYear, _ := time.Parse("15:04:05", "04:08:15")
diff := lastYear.Sub(thisYear)
fmt.Printf("比去年快了 %v\n", diff)
输出:比去年快了 7分7秒。
这一下子就有意思了,我不光知道成绩,还能看到自己的进步趋势,如果你跑过好几届,甚至可以画个折线图出来(当然那是另一个话题了)。
给参赛者的一些小建议
如果你也打算用Go自己写查询工具,有几个坑帮你踩过了:
- API的请求频率别太高 —— 很多赛事网站有反爬机制,建议每次请求间隔至少1秒
- 参赛号注意大小写 —— 黄河口马拉松的参赛号有时是字母+数字的组合,注意大小写
- 成绩查询时间窗口 —— 比赛结束后一般24小时内数据才完整,别刚跑完就疯狂刷
如果你只是想快速查成绩,用我的工具也行,我已经把代码放GitHub了(搜“黄河口马拉松查询小工具”就能找到),但更推荐的还是——官网要是没崩,直接在官网查,毕竟官方数据最权威。
写在最后
查成绩这件事,说大不大,说小不小,但每次跑完比赛,查询那一刻的心情,跟拆快递差不多,你一边紧张一边期待,想知道自己这段时间的汗水到底值不值,黄河口马拉松的赛道我特别喜欢,沿着黄河入海口跑,风景独好,如果你也跑了,不妨试试用Go查成绩,顺便体验一把程序员的小乐趣。
(对了,老张后来用我的工具查了,说比他手机摔之前查到的快多了。)
本文来自作者[kyadmin]投稿,不代表中国·AC米兰(Milan)体育官方网站-Official Website立场,如若转载,请注明出处:http://www.yx727.com/ty/853.html
评论列表(4条)
我是中国·AC米兰(Milan)体育官方网站-Official Website的签约作者“kyadmin”!
希望本篇文章《黄河口马拉松成绩查询,用Golang写一份靠谱的查询工具,顺便聊聊那些年跑过的东营》能对你有所帮助!
本站[中国·AC米兰(Milan)体育官方网站-Official Website]内容主要涵盖:AC米兰,ac米兰官网,AC米兰官网
本文概览:为啥突然想写这个?前几天刷朋友圈,看到老张在晒黄河口马拉松的完赛奖牌,配文是“今年PB了,但查成绩查得差点把手机摔了”,我一看就乐了...