GitHub仓库地址:

效果预览:

效果预览

数据接口

我调用的资源来源于:中国气象局-天气预报

寻找接口

首先进入该网站,F12进入开发者工具,选择网络->Fetch/XHR,然后在搜索框随便搜索一个城市。

image-20220925122005356

出现了三个地址。分别点进去看看,发现第一个就是我们需要的数据。

image-20220925122158079

image-20220925122240019

这个接口是怎么调用的呢,比如北京和成都分别对应54511和56294,所以可能是一个城市对应一个号码。

1
2
3
4
5
# 北京
https://weather.cma.cn/api/now/54511

# 成都
https://weather.cma.cn/api/now/56294

所以我通过百度找到了全国城市对应的天气编码,格式化成了一个字典。里面包含了全国绝大多数地级市,但是没有县级城市。

image-20220925123025200

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
city_code = {
"澳门": 45011,
"大兴安岭": 50442,
"黑河": 50468,
"齐齐哈尔": 50745,
"伊春": 50774,
"鹤岗": 50775,
"绥化": 50853,
"佳木斯": 50873,
"双鸭山": 50884,
"白城": 50936,
"哈尔滨": 50953,
"七台河": 50973,
"鸡西": 50978,
"阿勒泰": 51076,
"塔城": 51133,
"博州": 51238,
"克拉玛依": 51243,
"石河子": 51356,
"昌吉": 51368,
"伊宁": 51431,
"乌鲁木齐": 51463,
"吐鲁番": 51573,
"阿克苏": 51628,
"巴州": 51656,
"克州": 51704,
"喀什": 51709,
"和田": 51828,
"哈密": 52203,
"酒泉": 52533,
"张掖": 52652,
"金昌": 52675,
"武威": 52679,
"西宁": 52866,
"平安县": 52875,
"兰州": 52889,
"白银": 52896,
"同仁县": 52974,
"临夏": 52984,
"定西": 52995,
"包头": 53446,
"呼和浩特": 53463,
"大同": 53487,
"乌海": 53512,
"石嘴山": 53518,
"朔州": 53578,
"吴忠": 53612,
"银川": 53614,
"榆林": 53646,
"忻州": 53674,
"石家庄": 53698,
"太原": 53772,
"阳泉": 53782,
"邢台": 53798,
"固原": 53817,
"延安": 53845,
"临汾": 53868,
"长治": 53882,
"邯郸": 53892,
"安阳": 53898,
"平凉": 53915,
"铜川": 53947,
"运城": 53959,
"晋城": 53976,
"济源": 53978,
"焦作": 53982,
"新乡": 53986,
"鹤壁": 53990,
"牡丹江": 54094,
"通辽": 54135,
"四平": 54157,
"长春": 54161,
"吉林": 54172,
"赤峰": 54218,
"阜新": 54237,
"铁岭": 54249,
"辽源": 54260,
"锦州": 54337,
"盘锦": 54338,
"鞍山": 54339,
"沈阳": 54342,
"本溪": 54346,
"辽阳": 54347,
"通化": 54363,
"白山": 54371,
"张家口": 54401,
"承德": 54423,
"秦皇岛": 54449,
"葫芦岛": 54453,
"营口": 54471,
"丹东": 54497,
"北京": 54511,
"廊坊": 54515,
"天津": 54527,
"唐山": 54534,
"保定": 54602,
"沧州": 54616,
"大连": 54662,
"衡水": 54702,
"德州": 54714,
"滨州": 54734,
"东营": 54736,
"烟台": 54765,
"威海": 54774,
"香港": 45005,
"聊城": 54806,
"济南": 54823,
"泰安": 54827,
"莱芜": 54828,
"淄博": 54830,
"潍坊": 54843,
"青岛": 54857,
"濮阳": 54900,
"菏泽": 54906,
"济宁": 54915,
"临沂": 54938,
"日照": 54945,
"噶尔县": 55437,
"日喀则": 55578,
"拉萨": 55591,
"合作": 56080,
"昌都县": 56137,
"绵阳": 56196,
"德阳": 56198,
"雅安": 56287,
"成都": 56294,
"资阳": 56298,
"林芝县": 56312,
"乐山": 56386,
"眉山": 56391,
"自贡": 56396,
"宜宾": 56492,
"昭通": 56586,
"丽江": 56651,
"攀枝花": 56666,
"六盘水": 56693,
"保山": 56748,
"大理": 56751,
"楚雄": 56768,
"昆明": 56778,
"曲靖": 56783,
"玉溪": 56875,
"临沧县": 56951,
"思茅": 56964,
"文山县": 56994,
"天水": 57006,
"宝鸡": 57016,
"西安": 57036,
"渭南": 57045,
"咸阳": 57048,
"三门峡": 57051,
"洛阳": 57073,
"郑州": 57083,
"许昌": 57089,
"开封": 57091,
"南阳": 57178,
"漯河": 57186,
"周口": 57195,
"广元": 57206,
"安康": 57245,
"襄樊": 57278,
"驻马店": 57290,
"信阳": 57297,
"巴中": 57313,
"达州": 57328,
"荆门": 57377,
"随州": 57381,
"遂宁": 57405,
"南充": 57411,
"广安": 57415,
"恩施": 57447,
"宜昌": 57461,
"荆州": 57476,
"孝感": 57482,
"武汉": 57494,
"鄂州": 57496,
"黄冈": 57498,
"重庆": 57516,
"大庸": 57558,
"岳阳": 57584,
"咸宁": 57590,
"常德": 57662,
"益阳": 57674,
"长沙": 57687,
"毕节": 57707,
"遵义": 57713,
"铜仁": 57741,
"怀化": 57749,
"娄底": 57763,
"邵阳": 57766,
"湘潭": 57773,
"株洲": 57780,
"萍乡": 57786,
"宜春": 57793,
"新余": 57796,
"安顺": 57806,
"贵阳": 57816,
"凯里": 57825,
"都匀": 57827,
"衡阳": 57872,
"桂林": 57957,
"郴州": 57972,
"赣州": 57993,
"商丘": 58005,
"枣庄": 58024,
"徐州": 58027,
"连云港": 58044,
"亳州": 58102,
"淮北": 58116,
"宿州": 58122,
"宿迁": 58131,
"淮安": 58145,
"盐城": 58151,
"阜阳": 58203,
"蚌埠": 58221,
"淮南": 58224,
"滁州": 58236,
"南京": 58238,
"扬州": 58245,
"泰州": 58246,
"镇江": 58248,
"南通": 58259,
"六安": 58311,
"合肥": 58321,
"巢湖": 58326,
"芜湖": 58334,
"马鞍山": 58336,
"常州": 58343,
"无锡": 58354,
"苏州": 58357,
"上海": 58362,
"黄石": 58407,
"安庆": 58424,
"池州": 58427,
"铜陵": 58429,
"宣城": 58433,
"湖州": 58450,
"嘉兴": 58452,
"绍兴": 58453,
"杭州": 58457,
"舟山": 58477,
"九江": 58502,
"景德镇": 58527,
"金华": 58549,
"南昌": 58606,
"抚州": 58617,
"鹰潭": 58627,
"衢州": 58633,
"丽水": 58646,
"温州": 58659,
"台州": 58660,
"三明": 58828,
"南平": 58834,
"宁德": 58846,
"福州": 58847,
"龙岩": 58927,
"莆田": 58946,
"河池地区": 59023,
"柳州": 59046,
"贺州地区": 59065,
"韶关": 59082,
"漳州": 59126,
"泉州": 59131,
"厦门": 59134,
"百色": 59211,
"来宾": 59242,
"贵港": 59249,
"梧州": 59265,
"肇庆": 59278,
"清远": 59280,
"广州": 59287,
"佛山": 59288,
"东莞": 59289,
"河源": 59293,
"潮州": 59312,
"揭阳": 59315,
"汕头": 59316,
"崇左": 59425,
"玉林": 59453,
"云浮": 59471,
"中山": 59485,
"珠海": 59488,
"深圳": 59493,
"汕尾": 59501,
"高雄": 59554,
"钦州": 59632,
"防城港": 59635,
"北海": 59644,
"湛江": 59658,
"茂名": 59659,
"阳江": 59663,
"海口": 59758,
"三亚": 59948,
"西沙": 59981
}

调用接口

找到了接口,接下来就是使用了。返回的数据是个很简单的JSON。格式如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"msg": "success",
"code": 0,
"data": {
"location": {
"id": "56294",
"name": "成都",
"path": "中国, 四川, 成都"
},
"now": {
"precipitation": 0,
"temperature": 21.1,
"pressure": 955,
"humidity": 74,
"windDirection": "西南风",
"windDirectionDegree": 211,
"windSpeed": 0.8,
"windScale": "微风"
},
"alarm": [],
"lastUpdate": "2022/09/25 12:10"
}
}

然后调用并解析该JSON格式的数据。

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
import requests
from city_code import city_code

api = "https://weather.cma.cn/api/now/"


def get_weather(city):
for key in city_code:
if city == key:
url = api + str(city_code[key])
req = requests.get(url)
# 解析数据
data = req.json()
# 地区
loc = data['data']['location']['path']
# 风向
windDirection = data['data']['now']['windDirection']
# 风向度
windDirectionDegree = str(data['data']['now']['windDirectionDegree'])
# 风速
windSpeed = str(data['data']['now']['windSpeed'])
# 风力等级
windScale = str(data['data']['now']['windScale'])
# 温度
temperature = str(data['data']['now']['temperature'])
# 气压
pressure = str(data['data']['now']['pressure'])
# 湿度
humidity = str(data['data']['now']['humidity'])
weather = {
"地区": loc,
"温度": temperature,
"风向": windDirection,
"风向度": windDirectionDegree,
"风力等级": windScale,
"风速": windSpeed,
"湿度": humidity,
"气压": pressure
}
# 返回数据
return weather
else:
continue
return 0

最后的封装就非常简单了,可以直接看仓库的源代码。