以下内容为自己的学习笔记,如需求转载,请声明原文链接 微信公众号「ENG八戒」mp.weixin.qq.com/s/FgoU8Cxof…

Excel: Python 怎么干掉 VBA 系列 丙

获取网络动态数据

本文开端之前夸过海口,说要演示一下喂养牲畜的饲料动态本钱,其实因为职业数据具有一定的商业属性,调用这类接口费钱,所以不计划展开了。

但简简略单地获取一下网络上有点意思的数据,仍是可以的哦。不妨读个气候实时数据吧?然后封装成函数,再在 Excel 里调用演示一下。

设想一下,已然需求获取气候数据,那么就离不开详细的地址信息,比方地址称号、地理坐标等。一般咱们都习气依照区域来划分气候状况,或许更新气候报告。

比方,刚起床,不知道今日广州气候怎样呢?要不要穿短袖?(现在现已是冬季啦)

可是现在市面上常见的接口都是直接根据 city id 来访问的,这个 city id 便是一串数字,类似咱们的身份证号码,独一无二地代表各个城市。这个 city id 也可以经过 Web API 获取。

那么现在有什么比较好用或许门槛比较低的 Web API 可以便利咱们去测验一下呢?

已然是为了测验,那么咱们作为学习者就喜爱薅羊毛了,又不是给公司调试产品,不免费怎样过意得去?八戒找到一个非常便利好用的接口给大家,供货商是 和风气候 qweather.com

想要从 qweather.com 读取到气候数据,最简略地可以调用两条接口,一个是获取 city id 的接口,另一个是根据 city id 获取气候数据的接口。假如想要使用这两个接口,主张先登录官网注册一个账号,然后创建项目时挑选免费订阅,再增加 Web API 类型的 key(现在约束最多 20 条)。

查询 city id

以广州为例

https://geoapi.qweather.com/v2/city/lookup?location=广州&adm=广东&key=XXXXXX

location= 后边填城市名,adm= 后边填城市的上级省份或许区的上级城市,key= 后边填的 XXXXXX 便是你在官网注册时分手动增加的 key。

adm 参数不是必须的。一般为了防止重名的城市,比方陕西西安、吉林西安等,接口主张带上 adm 参数。

Excel: Python 怎么干掉 VBA 系列 丙

回来的是 json 格式数据,从内容来看,包括了广州各个区对应的 city id,也包括了整个市级其他 city id。一般用市级其他 city id 就够了,除非你想查询的是某个区的 city id。

"name":"广州",
"id":"101280101"

像上面这段,id 字段后边的值便是咱们终究想要获取的数据,city id 字符串。

为了便利查询 city id,那么咱们来写个函数封装完成调用上面的接口,接纳呼应数据,提取方针城市的 city id 而且回来

def get_city_id(city_name, province_name):
    url = "https://geoapi.qweather.com/v2/city/lookup?location={}&adm={}&key={}".format(city_name, province_name, api_key)
    response = requests.get(url)
    # print(response.text)
    data = json.loads(response.text)
    array = data["location"]
    for area in array:
        print("area = {}".format(area["name"]))
        if area["name"] == city_name:
            print("city {} id {}".format(city_name, area["id"]))
            return area["id"]
    return None

因为回来的内容里,含有包括有广州字样的一切区域,比方各个区级,所以要遍历一下,然后比较字段 name 的值是否等于 广州,等于就表明找到了方针目标。

假如没找到匹配的内容,应该回来 None 表明获取失败。

看看测验比如

get_city_id("广州", "广东")
get_city_id("香港", "香港")
get_city_id("北京", "北京")

运转成果

area = 广州
city 广州 id 101280101
area = 香港
city 香港 id 101320101
area = 北京
city 北京 id 101010100

一切还算顺畅,可是要提示的是,查询城市对应的 city id 这种非实时动态改变的数据,主张自己做好本地缓存。意思便是不需求每次都从他人的服务器查询这些不会经常变化的数据,应该优先从自己的记载中读取。

查询详细气候数据

持续上面的比如,查询广州的现时气候数据

https://devapi.qweather.com/v7/weather/now?location=101280101&key=XXXXXX

location= 后边填上一个接口查询到的 city id,key= 后边填的 XXXXXX 同样是你在官网注册时分手动增加的 key。

接口中的 now 表明查询的数据是实时值。假如需求查询往后几天的气候预报数据等,需求将 now 改为其它,这儿不展开。

Excel: Python 怎么干掉 VBA 系列 丙

回来的也是 json 格式数据,从内容来看,咱们的方针数据是 now 目标的 temp 子目标值,也便是温度值。

为了回来气候数据,简略起见只挑选温度值。持续写个函数,直接调用前面现已封装好的函数 get_city_id 来查询城市对应的 city id,然后再调用第二个接口获取气候数据,接纳呼应数据,提取方针城市的温度值而且回来

def temperature(city_name, province_name):
    city_id = get_city_id(city_name, province_name)
    if city_id is None:
        print("fail to get city id of {}".format(city_name))
        return None
    url = "https://devapi.qweather.com/v7/weather/now?location={}&key={}".format(city_id, api_key)
    response = requests.get(url)
    # print(response.text)
    data = json.loads(response.text)
    print("city {} {}℃n".format(city_name, data["now"]["temp"]))
    return data["now"]["temp"]

前面现已讲过,查询城市对应的 city id 是有可能失败的,所以有必要对函数 get_city_id 的回来值做检查,假如为过错值 None 就打印过错信息(这便是常说的日志,用于调试排查过错用),而且终止流程,也回来 None 作为过错值。

看看测验比如

temperature("广州", "广东")
temperature("香港", "香港")
temperature("北京", "北京")

运转成果

area = 广州
city 广州 id 101280101
city 广州 21℃
area = 香港
city 香港 id 101320101
city 香港 23℃
area = 北京
city 北京 id 101010100
city 北京 0℃

看起来北方现在好冷呀,仍是广东的温度舒服~

从上面的测验成果来看,逻辑功用的函数是写好了,可是假如要在 Excel 表格中可以插入查询温度的函数 temperature, 应该参照前面 hello 函数的格式,在函数 temperature 的声明上一行增加 @xw.func 即可

@xw.func
def temperature(city_name, province_name):
...

终究来看看实际效果,翻开表格 fishfeed.xlsm 里,选中一个单元格,点击工具栏里的按钮 Import Functions,然后输入

=temperature("广州","广东")

Excel: Python 怎么干掉 VBA 系列 丙

很好,成果满意吗?

这个系列暂时到这儿停止,你有什么疑问都可以直接联络我,和我聊聊?