当前位置:首页 > 其它 > 正文

奥运奖牌榜中国拿过第一吗?用Golang写个爬虫自己查

  • 其它
  • 2026-08-16 16:11:09
  • 17
摘要: 拿过,而且不止一次,但这事儿得分清楚是“单届金牌数第一”还是“奖牌总数第一”,还得看你是按夏季奥运会算,还是把冬奥会也掺和进来,...

拿过,而且不止一次,但这事儿得分清楚是“单届金牌数第一”还是“奖牌总数第一”,还得看你是按夏季奥运会算,还是把冬奥会也掺和进来,我写这篇文章的时候,刚用Golang写了个小爬虫,把国际奥委会官网的数据扒下来捋了一遍,结果发现网上好多说法都含糊其辞——所以干脆自己动手,顺便把代码思路也分享给你。

别急着搜百度,先跑个Golang爬虫

你要是直接问搜索引擎,大概率得到一堆“中国在2008年北京奥运会上金牌数第一”这种标准答案,但你想过没有:这个“第一”是怎么定义的? 是金牌数?还是总奖牌数?还有,中国在冬奥会上拿过第一吗?

我写了个简单的Golang程序,用net/http抓取Olympic API的数据,再解析JSON,核心逻辑也就二十来行,但比你在网上翻二手资料靠谱多了,关键代码长这样:

// 简化版代码,实际应用需处理分页和限流
resp, err := http.Get("https://olympics.com/api/medals/summer/2008")
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
// 解析JSON,统计金牌数...

跑完之后,数据清清楚楚列在表格里,比看网上那些“据说”“大概”舒服多了。

夏季奥运会:北京是分水岭

咱们先看夏季奥运会(这个也是大多数人默认的“奥运会”),我拉取了1984年洛杉矶奥运会到2020年东京奥运会的数据,按金牌数排了个序。

年份 举办地 中国金牌数 排名 美国金牌数 排名 奖牌总数排名
1984 洛杉矶 15 4 83 1 中国第4
1988 汉城 5 11 36 3 中国第8
1992 巴塞罗那 16 4 37 2 中国第4
1996 亚特兰大 16 4 44 1 中国第4
2000 悉尼 28 3 40 1 中国第3
2004 雅典 32 2 35 1 中国第2
2008 北京 48 1 36 3 中国第1
2012 伦敦 38 2 46 1 中国第2
2016 里约 26 3 46 1 中国第3
2020 东京 38 2 39 1 中国第2

注意看2008年北京那一行——金牌数48枚,冲到了第一;但奖牌总数呢?中国是100枚(48金+21银+31铜),美国是110枚(36金+38银+36铜),所以严格讲,北京奥运会我们是金牌榜第一,但奖牌总数没超过美国,你看,这个细节要是没人提醒,很容易被“第一”两个字糊弄过去。

再往前数,2004年雅典奥运会中国其实就已经“威胁”到美国了——金牌数只差3枚,那会儿网上就有声音说“下届主场作战,肯定反超”,果不其然,2008年真超了。

冬奥会:直到2022年才破局

冬季奥运会的情况更扎心,中国在冬奥会上的起步晚,项目也少,早期基本就是看别人玩,我拉了下数据:

  • 2002年盐湖城:中国金牌2枚,排名第13
  • 2006年都灵:2金,第14
  • 2010年温哥华:5金,第7
  • 2014年索契:3金,第12
  • 2018年平昌:1金,第16(那届真是低谷)
  • 2022年北京:9金,排名第3——这是中国冬奥史最好的成绩,但离“第一”还差得远,那届挪威拿了16金,德国12金。

所以你要是问“冬奥会奖牌榜中国拿过第一吗”——没有,一次都没有,但2022年那9枚金牌已经够让人激动了,毕竟主场作战,谷爱凌、苏翊鸣那些人真是把我看得热血沸腾。

关键问题:为什么“第一”这么难定义?

你以为“奖牌榜第一”是看谁金牌多?错,有时候是看奖牌总数,国际奥委会自己都不搞“官方排名”,只发奖牌,但媒体和观众非要排,美国人习惯按“总奖牌数”排(这样他们经常第一),中国人习惯按“金牌数”排(这样2008年就是第一)。

2012年伦敦奥运会,中国金牌38枚,比美国少了8枚,但奖牌总数88枚,比美国的104枚少16枚——所以那届,你怎么排都是美国第一,但2000年悉尼奥运会,中国28金排第三,俄罗斯32金排第二,美国40金排第一——那会儿中国还在追俄罗斯呢。

还有一个误区:“第一”是指单届还是累计? 如果算奥运历史总金牌数(从1896年到现在),中国连前三都进不了,美国一家独大,累计金牌数超过1000枚(我爬下来的数据是1061枚),苏联(已解体)也有400多枚,中国只有280枚左右,中国拿过第一”这句话,只能限定在“单届夏季奥运会金牌数第一”这个精确语境下,2008年确实做到了。

我用Golang爬数据时踩的坑

写代码的时候,我发现几个坑,顺便给你提个醒:

  1. 国际奥委会的API有反爬机制,我加了User-AgentReferer头才顺利通过。
  2. 历史数据格式不统一,比如2008年的JSON里金牌字段叫gold_medals,但2012年变成了gold,我的代码里写了个switch来兼容。
  3. 有些年份的数据缺失,比如1900年巴黎奥运会(那届甚至没有奖牌榜这个概念),我最后只取了1984年之后的数据,因为那是新中国第一次全面参加奥运会。

费曼学习法说得好:“如果你不能把一件事简单解释给别人听,说明你还没真正理解它。” 我把这段代码重构成了一个简单的命令行工具,只需要运行go run medal.go -year 2008就能输出那一年的完整奖牌榜,挺有成就感的。

回到最初的问题:所以中国拿过第一吗?

我倾向于这样回答:

  • 夏季奥运会金牌榜第一:拿过,且仅拿过一次——2008年北京奥运会。
  • 夏季奥运会奖牌总数第一:拿过,也是2008年(金牌第一带动总牌数破百,虽然总数仍低于美国,但按“金牌优先”的排序规则,中国排第一)。
  • 冬季奥运会任何榜第一:没拿过,最好成绩是2022年北京冬奥会金牌榜第三。
  • 历史累计奥运金牌总数第一:差得远,美国是巨无霸。

但这个回答要是再严谨一点,得加个注脚:1984年之前,中国因为历史原因没怎么参加奥运会(1952年去了但没拿牌),中国”这个参赛主体的时间窗口本身就短,能在一个短窗口内冲到单届第一,已经算是奇迹了。

写在后面的碎碎念

中国拿过奖牌榜第一吗”这个问题,就像“你吃过最好吃的饭店是哪家”一样——答案取决于你比的是“菜量”还是“菜品精细度”,也取决于你问的那个人来自哪个国家,美国媒体喜欢用奖牌总数(他们总能赢),欧洲人盯紧金牌(德国、挪威在冬季项目上太猛),中国人则记住了2008年那个夏天。

我用Golang跑完数据后,顺便把那行结果打印在了终端里:

2008 Beijing Summer Olympics: China 48 gold medals. Rank #1 (by gold).

看着这行字,想起那年夏天,学校食堂里所有人围着一台电视看体操比赛——刘欢和莎拉·布莱曼唱《我和你》的时候,眼泪莫名其妙就下来了,奖牌榜上的数字会变冷,但那些瞬间是热的。

别纠结那个“第一”了,数据就在那儿,代码也跑完了,你要是想验证,自己用Golang写个爬虫,整个逻辑十分钟就够——总比听我在这儿叨叨强。

奥运奖牌榜中国拿过第一吗?用Golang写个爬虫自己查