首页 > 代码库 > Python Flask 天气查询
Python Flask 天气查询
一直觉得自己的博客太简单了,今天想加点功能上去,说干就干,准备加个最常用的,天气预报功能。
看了几个例子,觉得也不是很难,网上找个接口就是了,不过,这百度的apistore里面。。。死活不让我获取手机验证码,所以转向JUHE里面去,还送500次的免费次数,绝对够用了
进入正题
首先,这个功能的主旨是:通过其他网站提供的api接口取回数据,一般是JSON格式的,然后自己渲染在前端页面上
直接看代码,这个代码是测试用例,最后加到网站以后还需要自行修改,不用class,直接添加函数就好。
import os,urllib.request,urllib.parse import json class weather(): code_uri = "http://v.juhe.cn/weather/index" #api的基础地址,不会变,所以单独设一个变量 def check_weather(self): #让用户自行输入需要查询的地址 city = input(‘请输入城市名:‘) #url地址里面的查询参数,urllib的用法后面单独讲 parameter = urllib.parse.urlencode({"cityname":city,"dtype":"","format":"","key":"你自己申请到的apikey"}) #最终合成的uri地址 uri = self.code_uri +"?"+parameter #通过json模块来读取上面接口打开后返回的数据,并解码 ret = json.loads(urllib.request.urlopen(uri).read().decode("utf8")) if ret[‘error_code‘] !=0: #如果错误代码不为0 print (ret[‘reason‘]) #则打印原因 print (ret[‘error_code‘]) #和具体哪个故障点 return (ret[‘reason‘],ret[‘error_code‘]) else: print (ret[‘reason‘]) #如果没有错误,打印生成结果 #则用output表示查询出来的内容 output = "城市:"+ret[‘result‘][‘today‘][‘city‘]+"\r\n" output += "日期:"+ret[‘result‘][‘today‘][‘date_y‘]+","+ret[‘result‘][‘today‘][‘week‘]+"\r\n" output += "天气:"+ret[‘result‘][‘today‘][‘weather‘] return output if __name__=="__main__": test = weather() test.check_weather()
测试结果如图
在juhe上面的接口介绍里面,有写他返回的JSON数据格式是怎么样的
可以看到,第一层就有resultcode和reason,实际数据在result里面
{ "resultcode": "200", "reason": "查询成功!", "result": { "sk": { /*当前实况天气*/ "temp": "21", /*当前温度*/ "wind_direction": "西风", /*当前风向*/ "wind_strength": "2级", /*当前风力*/ "humidity": "4%", /*当前湿度*/ "time": "14:25" /*更新时间*/ }, "today": { "city": "天津", "date_y": "2014年03月21日", "week": "星期五", "temperature": "8℃~20℃", /*今日温度*/ "weather": "晴转霾", /*今日天气*/ "weather_id": { /*天气唯一标识*/ "fa": "00", /*天气标识00:晴*/ "fb": "53" /*天气标识53:霾 如果fa不等于fb,说明是组合天气*/ }, "wind": "西南风微风", "dressing_index": "较冷", /*穿衣指数*/ "dressing_advice": "建议着大衣、呢外套加毛衣、卫衣等服装。", /*穿衣建议*/ "uv_index": "中等", /*紫外线强度*/ "comfort_index": "",/*舒适度指数*/ "wash_index": "较适宜", /*洗车指数*/ "travel_index": "适宜", /*旅游指数*/ "exercise_index": "较适宜", /*晨练指数*/ "drying_index": ""/*干燥指数*/ }, "future": [ /*未来几天天气*/ { "temperature": "28℃~36℃", "weather": "晴转多云", "weather_id": { "fa": "00", "fb": "01" }, "wind": "南风3-4级", "week": "星期一", "date": "20140804" }, { "temperature": "28℃~36℃", "weather": "晴转多云", "weather_id": { "fa": "00", "fb": "01" }, "wind": "东南风3-4级", "week": "星期二", "date": "20140805" }, { "temperature": "27℃~35℃", "weather": "晴转多云", "weather_id": { "fa": "00", "fb": "01" }, "wind": "东南风3-4级", "week": "星期三", "date": "20140806" }, { "temperature": "27℃~34℃", "weather": "多云", "weather_id": { "fa": "01", "fb": "01" }, "wind": "东南风3-4级", "week": "星期四", "date": "20140807" }, { "temperature": "27℃~33℃", "weather": "多云", "weather_id": { "fa": "01", "fb": "01" }, "wind": "东北风4-5级", "week": "星期五", "date": "20140808" }, { "temperature": "26℃~33℃", "weather": "多云", "weather_id": { "fa": "01", "fb": "01" }, "wind": "北风4-5级", "week": "星期六", "date": "20140809" }, { "temperature": "26℃~33℃", "weather": "多云", "weather_id": { "fa": "01", "fb": "01" }, "wind": "北风4-5级", "week": "星期日", "date": "20140810" } ] }, "error_code": 0 }
好,测试用例就这么可以实现了
再来看看里面涉及到的库urllib.request和urllib.parse
urllib.parse这个是生成查询字符串的
http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=您申请的KEY
比如上面的 format=2&cityname=%E8%8B%8F%E5%B7%9E&key=您申请的KEY
urllib.parse有2个参数可以用,第一个是urllib.parse.urlencode(‘你要解析的对象‘),比如下面
parameter = urllib.parse.urlencode({"cityname":city,"dtype":"","format":"","key":"你自己的apikey"})这样,他同时实现了2个功能
1:对输入参数中的值进行了解析
2:如果同时有多个参数,他能自动编排为 &dtype=&format=&key= ,当然前面查询字符串的问号?还是要自己打的
比如说下图中的上海2个字,你需要在url里面解析完以后给接口(当然,这取决于接口的需要,这个天气预报的需求里面是要求解析的)
那如果说我查询字符串里面,就只有一个参数,怎么办呢?
这里有一个针对一个的函数
urllib.parse.quote(‘你要解析的对象‘)
主要的功能就是这样,最后自己给主页添加一个天气查询的页面,再添加一个查询结果的页面。。。
因为前端知识比较渣....所以只能分为2个页面做,哈哈
功能实现就好
如果你随便输个什么字,他也会返回错误,比如下面
Python Flask 天气查询