python获取城市天气情况案例

我主要是参考中国开源社区OSchina上的源码进行学习http://www.oschina.net/code/snippet_946290_45838

非常感谢原作者),我将每个步骤分别进行讲解,比原作者更加详细

源码如下:

__author__ = 'dyb'

import os
import urllib.request
import urllib.parse
import json


class weather(object):

    # 获取城市代码的uri
    citycode_uri = "http://apistore.baidu.com/microservice/cityinfo?cityname="

    # 获取天气信息的uri
    weather_uri = "http://apistore.baidu.com/microservice/weather?cityid="
    
    #主要业务逻辑处理
    def mainHandle(self):
        print("输入你要查询天气的城市:")
        city_name = input()
        uri = self.citycode_uri + urllib.parse.quote(city_name)
        ret = json.loads(urllib.request.urlopen(uri).read().decode("utf8"))
        if(ret['errNum']) != 0:
            print('网络或者服务器出错')
            return False
        else:
            weather_uri = self.weather_uri + ret['retData']['cityCode']
            data = json.loads(urllib.request.urlopen(weather_uri).read().decode("utf8"))
            if data['errNum'] == 0:
                ret_data = data['retData']
                output = "城市名:" + ret_data['city'] + "\r\n"
                output += "更新时间:" + ret_data["date"] + " " + ret_data["time"] + "\r\n"
                output += "城市编码:" + ret_data['citycode'] + "\r\n"
                output += "经度:" + str(ret_data['longitude']) + "\r\n"
                output += "维度:" + str(ret_data['latitude']) + "\r\n"
                output += "邮编:" + ret_data['postCode'] + "\r\n"
                output += "海拔:" + ret_data['altitude'] + "\r\n"
                output += "天气情况:" + ret_data["weather"] + "\r\n"
                output += "温度:" + ret_data["temp"] + "\r\n"
                output += "最低气温:" + ret_data['l_tmp'] + "\r\n"
                output += "最高气温:" + ret_data['h_tmp'] + "\r\n"
                output += "风向:" + ret_data['WD'] + "\r\n"
                output += "风力:" + ret_data['WS'] + "\r\n"
                output += "日出时间:" + ret_data['sunrise'] + "\r\n"
                output += "日落时间:" + ret_data['sunset'] + "\r\n"
                print(output)
                return True
            else:
                print('网络或者服务器出错')
                return False
        

if __name__ == "__main__":
    weather = weather()
    weather.mainHandle()

首先是程序入口:

__name__ == "__main__"

模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__"。

在cmd 中直接运行.py文件,则__name__的值是'__main__';

而在import 一个.py文件后,__name__的值就不是'__main__'了;

从而用if __name__ == '__main__'来判断是否是在直接运行该.py文件

如:

#Test.py
class Test:
    def __init(self):pass
    def f(self):print 'Hello, World!'
if __name__ == '__main__':
    Test().f()
#End

你在cmd中输入:

C:>python Test.py

Hello, World!

说明:"__name__ == '__main__'"是成立的

你再在cmd中输入:

C:>python

>>>import Test

>>>Test.__name__                #Test模块的__name__

'Test'

>>>__name__                       #当前程序的__name__

'__main__'

以北京为例:

>>> 
输入你要查询天气的城市:
北京

上面的ret输出的结果是:

{'errNum': 0, 'retMsg': 'success', 'retData': {'zipCode': '100000', 'cityName': '北京', 'provinceName': '北京', 'telAreaCode': '010', 'cityCode': '101010100'}}

可以通过ret['errNum']这样的方式来获取json中各个对应的数据,如果这里不明白建议看下Python的元组、数组、映射(map)等相关知识

ret['errNum']  =0为成功=-1为失败

程序中变量data的输出值也是json格式,获取方式相同:

{'errNum': 0, 'errMsg': 'success', 'retData': {'temp': '-4', 'time': '18:00', 'citycode': '101010100', 'city': '北京', 'l_tmp': '', 'WD': '无持续风向', 'date': '15-02-11', 'postCode': '100000', 'pinyin': 'beijing', 'altitude': '33', 'sunrise': '07:12', 'weather': '晴', 'longitude': 116.391, 'WS': '微风(<10m/h)', 'sunset': '17:44', 'h_tmp': '-4', 'latitude': 39.904}}

JSON返回示例:
{
errNum: 0,
errMsg: "success",
retData: {
   city: "北京", //城市
   pinyin: "beijing", //城市拼音
   citycode: "101010100",  //城市编码
   date: "15-02-11", //日期
   time: "11:00", //发布时间
   postCode: "100000", //邮编
   longitude: 116.391, //经度
   latitude: 39.904, //维度
   altitude: "33", //海拔
   weather: "晴",  //天气情况
   temp: "10", //气温
   l_tmp: "-4", //最低气温
   h_tmp: "10", //最高气温
   WD: "无持续风向", //风向
   WS: "微风(<10m/h)", //风力
   sunrise: "07:12", //日出时间
   sunset: "17:44" //日落时间
  }    
}

output为输出语句,当输出经度和纬度的时候它们的格式是float类型,所以需要转换成str类型才能拼接在一起,使用str()函数

具体关于参数请参考天气的API介绍:http://apistore.baidu.com/astore/serviceinfo/1798.html

你可能感兴趣的:(Python,Python,获取城市天气,小案例,学习Python)