首页 > 代码库 > 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 天气查询