Python Flask 天气查询,,一直觉得自己的博客太
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 天气查询
评论关闭