Oct1a

Python查询天气

输入要查询的城市名称,就可以快速显示天气与温度

本章主要用了中国天气网(www.weather.com.cn)提供的天气查询接口。

可以在浏览器里试着访问一下:http://www.weather.com.cn/data/cityinfo/101010100.html

实现思路:

  1. 获取编码
  2. 获取输入的城市
  3. 解析Json
  4. 拼接URL
    5.输出结果

获取编码

获取所有省 / 直辖市的编号,如 “01 | 北京, 02 | 上海, 03 | 天津”

获取二级地区编号,如江苏是:city19.xml

得到最终的三级编号之后,再加上中国 101 的前缀,就得到了城市代码,如南京市区就是 “101190101”

获取city编码

from urllib import request
def main():
    url = 'http://m.weather.com.cn/data3/city.xml'
    content = request.urlopen(url,timeout = 2).read()
    content = content.decode("utf-8")
    provinces = content.split(',')
    print(provinces)
    url1 = 'http://m.weather.com.cn/data3/city%s.xml'
    result = 'city = { \n'
    for p in provinces:
        p_code = p.split('|')[0]
        url2 = url1 % p_code
        content2 = request.urlopen(url2,timeout = 20).read()
        content2 = content2.decode("utf-8")
        cites = content2.split(',')
        for c in cites:
            c_code = c.split('|')[0]
            url3 = url1 % c_code
            # print(url3)
            content3 = request.urlopen(url3,timeout = 20).read()
            content3 = content3.decode("utf-8")
            # print(content3)北安
            ccc = content3.split(',')
            try:
                for d in ccc:
                    d_pair = d.split('|')
                    d_code = d_pair[0]
                    name = d_pair[1]
                    url4 = url1 % d_code
                    content4 = request.urlopen(url4,timeout = 20).read()
                    content4 = content4.decode("utf-8")
                    ddd = content4.split('|')[1]
                    line = " '%s':'%s',\n" % (name,ddd)
                    # print(line)
                    result += line
                    print(name + ':'+ ddd)
            except:
                print("超时")
    result += '}'
    f = open('city.py','w')
    f.write(result)
    f.close()
if __name__ == '__main__':
    main()

最后输出

最后输出City.py文件

解析json

获取到的是Json编码

{

   "weatherinfo": {

       "city": "南京",

       "cityid": "101190101",

       "temp1": "37℃",

       "temp2": "28℃",

       "weather": "多云",

       "img1": "d1.gif",

       "img2": "n1.gif",

       "ptime": "11:00"

   }

}

完整代码

from urllib import request
from city import city
import chardet
import json
if __name__ == "__main__":
    cityname = str(input('想查什么城市?\n'))
    citycode = city.get(cityname)
    # print(citycode)
    if citycode:
        try:
            url = ('http://www.weather.com.cn/data/cityinfo/%s.html' %  citycode)
            content = request.urlopen(url).read()
            content = content.decode("utf-8")
            data = json.loads(content)
            result = data['weatherinfo']
            weather = ('%s\n  %s ~ %s') % (result['weather'],result['temp1'],result['temp2'])
            print(weather)
        except:
            print("查询失败")
    else:
        print("输入错误,没有该城市!")

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。