如何通过Python通过API获取天气数据?

中国天气网(http://www.weather.com.cn)向用户提供国内各城市天气信息,并提供API供程序获取所需的天气数据,返回数据格式为JSONAPI网址类似http://www.weather.com.cn/data/cityinfo/101020100.html,其中,101020100为城市编码。代码1-1为在中国天气网获取上海市当天天气预报数据的实例。

#代码1-1  weather_01.py
#!/usr/bin/env python3
#coding: utf-8
# author:weisen time:2020/6/1 23:41

import urllib.request
import json

code='101020100'
url='http://www.weather.com.cn/data/cityinfo/%s.html'% code

print('url=',url)
obj=urllib.request.urlopen(url)

print('type(obj)=',type(obj))
data_b=obj.read()
print('data_b=',data_b)
data_s=data_b.decode('utf-8')
print('data_s=',data_s)
data_dict=json.loads(data_s)
print('data_dict=',data_dict)
rt =data_dict['weatherinfo']
print('rt=',rt)
my_rt=('%s,%s,%s~%s')% (rt['city'],rt['weather'],rt['temp1'],rt['temp2'])
print(my_rt)

代码1-1 文件中,第2行是指明使用python3,第3行是指明使用utf-8编码方式。

第5行引入urllib包中的模块request,第6行引入json模块

第7行给变量code赋值上海市编码“101020100”,编码共9位,其中前5位表示省、自治区或者直辖市,接下来2位表示市或者地区,最后2位表示城市。

第8行用字符串变量url保存合成的网址,该网址为给定编码城市的当天天气预报。第9行输出变量url所保存的网址。

第10行调用函数urlopen()打开给定的网址,结果返回到对象obj中。第11行输出obj的类型。

第12行调用函数read()从对象obj中读取内容,保存到变量data_b中,变量data_b中的内容为bytes字节流数据。

第13行输出变量data_b的内容。

第14行将data_b中的bytes字节流数据转换为字符串类型保存到变量data_s中。

第15行输出变量data_s的内容。

第16行调用JSON的函数loads()将data_s中保存的字符串数据转换为字典型数据,保存到字典型变量data_dict中。

第17行输出变量data_dict的内容。

第18行从字典型变量data_dict中取得键为“weatherinfo”的内容,保存到变量rt中,rt仍然为字典型变量。

第19行输出变量rt的内容。

第20行合成字符串变量my_rt的内容,包括城市名称、天气状况、最高温和最低温,这些内容均从字典型变量rt中取得,键分别为“city”、 “weather”、“temp1”、 “temp2”。 第21行输出变量my_rt的内容。

代码1-1运行结果:

url= http://www.weather.com.cn/data/cityinfo/101020100.html
type(obj)= <class 'http.client.HTTPResponse'>
data_b= b'{"weatherinfo":{"city":"\xe4\xb8\x8a\xe6\xb5\xb7","cityid":"101020100","temp1":"19\xe2\x84\x83","temp2":"23\xe2\x84\x83","weather":"\xe5\xa4\xa7\xe9\x9b\xa8\xe8\xbd\xac\xe4\xb8\xad\xe9\x9b\xa8","img1":"n9.gif","img2":"d8.gif","ptime":"18:00"}}'
data_s= {"weatherinfo":{"city":"上海","cityid":"101020100","temp1":"19℃","temp2":"23℃","weather":"大雨转中雨","img1":"n9.gif","img2":"d8.gif","ptime":"18:00"}}
data_dict= {'weatherinfo': {'city': '上海', 'cityid': '101020100', 'temp1': '19℃', 'temp2': '23℃', 'weather': '大雨转中雨', 'img1': 'n9.gif', 'img2': 'd8.gif', 'ptime': '18:00'}}
rt= {'city': '上海', 'cityid': '101020100', 'temp1': '19℃', 'temp2': '23℃', 'weather': '大雨转中雨', 'img1': 'n9.gif', 'img2': 'd8.gif', 'ptime': '18:00'}
上海,大雨转中雨,19~23

由代码1-1运行结果可知,**函数urlopen()**的返回值为来自服务器的回应对象,调用其read()函数可得bytes字节流类型的数据,将bytes字节流类型的数据转换为字符串类型,即为JSON数据。调用JSON函数loads()可将JSON数据转换为字典型数据,而中国天气网返回的数据为嵌套1层的字典型数据,因此,首先通过rt=data_dict[‘weatherinfo’]取得城市天气预报信息,再通过rt[‘city’]、rt[‘weather’]、rt[‘temp1’]和rt[‘temp2’]取得具体的数据。

中国天气网还通过类似网址http://www.weather.com.cn/data/sk/101020100.html 以API方式提供各城市的实时天气数据。各城市编码可通过网络搜索取得。

目前绝大多数网站以动态网页的形式发布信息,所谓动态网页就是用相同的格式呈现不同的内容。例如,每天访问中国天气网,看到的信息呈现格式是不变的,但天气信息数据是变化的。如果网站没有提供API调用的功能,则可以先获取网页数据,然后将网页数据转换为字符串后利用正则表达式提取所需的内容,即所谓的爬虫方式。利用爬虫经常获取的是网页中动态变化的数据,因此,爬虫程序是自动获取网页中动态变化数据的工具。

你可能感兴趣的:(如何通过Python通过API获取天气数据?)