Python Flask 天气查询,,一直觉得自己的博客太


一直觉得自己的博客太简单了,今天想加点功能上去,说干就干,准备加个最常用的,天气预报功能。

看了几个例子,觉得也不是很难,网上找个接口就是了,不过,这百度的apistore里面。。。死活不让我获取手机验证码,所以转向JUHE里面去,还送500次的免费次数,绝对够用了


进入正题


首先,这个功能的主旨是:通过其他网站提供的api接口取回数据,一般是JSON格式的,然后自己渲染在前端页面上

直接看代码,这个代码是测试用例,最后加到网站以后还需要自行修改,不用class,直接添加函数就好。


import os,urllib.request,urllib.parseimport jsonclass 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:                 #如果错误代码不为0print (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 outputif __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 天气查询

评论关闭