Python Flask 天气查询
Posted bestallen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 天气查询的主要内容,如果未能解决你的问题,请参考以下文章