引言

这几天东京奥运会搞出了许多大新闻啊
这不, 东京直接变成《义勇军进行曲》速成班
所以, 让我们来写一个爬虫爬取奥运金牌榜, 看看祖国母亲到底有多牛逼!

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import os
import time
import codecs
import requests
import prettytable as pt

url = 'https://api.cntv.cn/olympic/getOlyMedals'
params = {
'serviceId': 'pcocean',
'itemcode': 'GEN-------------------------------',
}

json = requests.get(url, params=params).json()

result = json['data']['medalsList']

tb = pt.PrettyTable()
tb.field_names = ["排名", "国家或地区", "金牌数", "银牌数", "铜牌数", "总获奖数"]

for r in result:
tb.add_row([r['rank'], r['countryname'].ljust(10),
r['gold'], r['silver'], r['bronze'], r['count']])

print(tb)

filePath = 'medal.txt'
f = codecs.open(filePath, 'a', encoding='utf-8')
f.write(str(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) + os.linesep + os.linesep + str(tb) + os.linesep)

print(os.linesep + "done!" + os.linesep)
代码说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
os - 操作系统库 - 此处用于获取系统的换行符
time - 时间库 - 此处用于添加写入到文件的时间标记
codecs - 编码库 - 此处用于以 utf8 编码格式写入文本文件
requests - 请求库 - 此处用于获取网络请求来获取信息
prettytable - 制表库 - 用于绘制表格

金牌榜的网络信息
参数
-
-
-

获取 json 格式信息

获取返回结果

创建 表格
表格列名设定

循环所有结果
添加行到表格
-

打印表格

文件路径
追加模式打开文件
将表格写入文件

打印完成信息

效果

截至 8 月 5 日,
爬取到的数据效果是这样的:
当然, 由于字体原因, 表格看上去的不是那么齐, 将就啦!

数据效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
+------+------------------+--------+--------+--------+----------+
| 排名 | 国家或地区 | 金牌数 | 银牌数 | 铜牌数 | 总获奖数 |
+------+------------------+--------+--------+--------+----------+
| 1 | 中国 | 32 | 22 | 16 | 70 |
| 2 | 美国 | 25 | 31 | 23 | 79 |
| 3 | 日本 | 21 | 7 | 12 | 40 |
| 4 | 英国 | 15 | 18 | 15 | 48 |
| 5 | 澳大利亚 | 15 | 4 | 17 | 36 |
| 6 | 俄罗斯奥运队 | 14 | 21 | 18 | 53 |
| 7 | 德国 | 8 | 8 | 16 | 32 |
| 8 | 法国 | 6 | 10 | 9 | 25 |
| 9 | 意大利 | 6 | 9 | 15 | 30 |
| 10 | 荷兰 | 6 | 8 | 9 | 23 |
| 11 | 韩国 | 6 | 4 | 9 | 19 |
| 12 | 新西兰 | 6 | 4 | 5 | 15 |
| 13 | 古巴 | 5 | 3 | 4 | 12 |
| 14 | 匈牙利 | 4 | 5 | 3 | 12 |
| 15 | 加拿大 | 4 | 4 | 7 | 15 |
| 16 | 巴西 | 4 | 3 | 8 | 15 |
| 17 | 捷克 | 4 | 3 | 1 | 8 |
| 18 | 瑞士 | 3 | 4 | 5 | 12 |
| 19 | 波兰 | 3 | 3 | 4 | 10 |
| 20 | 克罗地亚 | 3 | 3 | 2 | 8 |
| 21 | 瑞典 | 2 | 5 | 0 | 7 |
| 22 | 中国台北 | 2 | 4 | 5 | 11 |
| 23 | 格鲁吉亚 | 2 | 4 | 1 | 7 |
| 24 | 丹麦 | 2 | 2 | 3 | 7 |
| 25 | 挪威 | 2 | 2 | 1 | 5 |
| 26 | 牙买加 | 2 | 1 | 2 | 5 |
| 27 | 伊朗 | 2 | 1 | 1 | 4 |
| 27 | 斯洛文尼亚 | 2 | 1 | 1 | 4 |
| 29 | 厄瓜多尔 | 2 | 1 | 0 | 3 |
| 30 | 乌兹别克斯坦 | 2 | 0 | 1 | 3 |
| 30 | 希腊 | 2 | 0 | 1 | 3 |
| 32 | 科索沃 | 2 | 0 | 0 | 2 |
| 32 | 卡塔尔 | 2 | 0 | 0 | 2 |
| 34 | 西班牙 | 1 | 4 | 5 | 10 |
| 35 | 罗马尼亚 | 1 | 3 | 0 | 4 |
| 35 | 委内瑞拉 | 1 | 3 | 0 | 4 |
| 37 | 乌克兰 | 1 | 2 | 8 | 11 |
| 38 | 肯尼亚 | 1 | 2 | 2 | 5 |
| 39 | 中国香港 | 1 | 2 | 0 | 3 |
| 39 | 南非 | 1 | 2 | 0 | 3 |
| 39 | 斯洛伐克 | 1 | 2 | 0 | 3 |
| 42 | 塞尔维亚 | 1 | 1 | 4 | 6 |
| 43 | 印度尼西亚 | 1 | 1 | 3 | 5 |
| 43 | 奥地利 | 1 | 1 | 3 | 5 |
| 45 | 比利时 | 1 | 1 | 1 | 3 |
| 45 | 埃塞俄比亚 | 1 | 1 | 1 | 3 |
| 45 | 乌干达 | 1 | 1 | 1 | 3 |
| 48 | 突尼斯 | 1 | 1 | 0 | 2 |
| 48 | 菲律宾 | 1 | 1 | 0 | 2 |
| 50 | 土耳其 | 1 | 0 | 5 | 6 |
| 51 | 以色列 | 1 | 0 | 2 | 3 |
| 51 | 爱尔兰 | 1 | 0 | 2 | 3 |
| 53 | 爱沙尼亚 | 1 | 0 | 1 | 2 |
| 53 | 斐济 | 1 | 0 | 1 | 2 |
| 53 | 拉脱维亚 | 1 | 0 | 1 | 2 |
| 53 | 白俄罗斯 | 1 | 0 | 1 | 2 |
| 57 | 泰国 | 1 | 0 | 0 | 1 |
| 57 | 百慕大 | 1 | 0 | 0 | 1 |
| 57 | 波多黎各 | 1 | 0 | 0 | 1 |
| 57 | 摩洛哥 | 1 | 0 | 0 | 1 |
| 61 | 哥伦比亚 | 0 | 2 | 1 | 3 |
| 61 | 多米尼加 | 0 | 2 | 1 | 3 |
| 61 | 亚美尼亚 | 0 | 2 | 1 | 3 |
| 61 | 吉尔吉斯斯坦 | 0 | 2 | 1 | 3 |
| 65 | 印度 | 0 | 1 | 2 | 3 |
| 65 | 蒙古 | 0 | 1 | 2 | 3 |
| 65 | 葡萄牙 | 0 | 1 | 2 | 3 |
| 68 | 保加利亚 | 0 | 1 | 1 | 2 |
| 68 | 圣马力诺 | 0 | 1 | 1 | 2 |
| 68 | 尼日利亚 | 0 | 1 | 1 | 2 |
| 71 | 约旦 | 0 | 1 | 0 | 1 |
| 71 | 土库曼斯坦 | 0 | 1 | 0 | 1 |
| 71 | 北马其顿 | 0 | 1 | 0 | 1 |
| 71 | 纳米比亚 | 0 | 1 | 0 | 1 |
| 75 | 哈萨克斯坦 | 0 | 0 | 4 | 4 |
| 76 | 墨西哥 | 0 | 0 | 3 | 3 |
| 76 | 埃及 | 0 | 0 | 3 | 3 |
| 76 | 阿塞拜疆 | 0 | 0 | 3 | 3 |
| 79 | 科威特 | 0 | 0 | 1 | 1 |
| 79 | 科特迪瓦 | 0 | 0 | 1 | 1 |
| 79 | 阿根廷 | 0 | 0 | 1 | 1 |
| 79 | 芬兰 | 0 | 0 | 1 | 1 |
| 79 | 马来西亚 | 0 | 0 | 1 | 1 |
| 79 | 加纳 | 0 | 0 | 1 | 1 |
| 79 | 叙利亚 | 0 | 0 | 1 | 1 |
+------+------------------+--------+--------+--------+----------+