一段Python实现的获取城市天气的代码,供大家娱乐参考。。
具体代码如下:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # import requests
- import urllib
- import json
- import sys
- from datetime import datetime, timedelta
- base_url = "http://api.worldweatheronline.com/free/v2/weather.ashx"
- codes = {'113': 'iconSunny',
- '116': 'iconPartlyCloudy',
- "119": 'iconCloudy',
- '122': 'iconVeryCloudy',
- '143': 'iconFog',
- '176': 'iconLightShowers',
- '179': 'iconLightSleetShowers',
- '182': 'iconLightSleet',
- '185': 'iconLightSleet',
- '200': 'iconThunderyShowers',
- '227': 'iconLightSnow',
- '230': 'iconHeavySnow',
- '248': 'iconFog',
- '260': 'iconFog',
- '263': 'iconLightShowers',
- '266': 'iconLightRain',
- '281': 'iconLightSleet',
- '284': 'iconLightSleet',
- '293': 'iconLightRain',
- '296': 'iconLightRain',
- '299': 'iconHeavyShowers',
- '302': 'iconHeavyRain',
- '305': 'iconHeavyShowers',
- '308': 'iconHeavyRain',
- '311': 'iconLightSleet',
- '314': 'iconLightSleet',
- '317': 'iconLightSleet',
- '320': 'iconLightSnow',
- '323': 'iconLightSnowShowers',
- '326': 'iconLightSnowShowers',
- '329': 'iconHeavySnow',
- '332': 'iconHeavySnow',
- '335': 'iconHeavySnowShowers',
- '338': 'iconHeavySnow',
- '350': 'iconLightSleet',
- '353': 'iconLightShowers',
- '356': 'iconHeavyShowers',
- '359': 'iconHeavyRain',
- '362': 'iconLightSleetShowers',
- '365': 'iconLightSleetShowers',
- '368': 'iconLightSnowShowers',
- '371': 'iconHeavySnowShowers',
- '374': 'iconLightSleetShowers',
- '377': 'iconLightSleet',
- '386': 'iconThunderyShowers',
- '389': 'iconThunderyHeavyRain',
- '392': 'iconThunderySnowShowers',
- '395': 'iconHeavySnowShowers'
- }
- icons = {
- 'iconSunny': [
- '\033[38;5;226m \\ / \033[0m',
- '\033[38;5;226m .-. \033[0m',
- '\033[38;5;226m ― ( ) ― \033[0m',
- '\033[38;5;226m `-’ \033[0m',
- '\033[38;5;226m / \\ \033[0m'],
- 'iconPartlyCloudy': [
- "\033[38;5;226m \\ /\033[0m ",
- "\033[38;5;226m _ /\"\"\033[38;5;250m.-. \033[0m",
- "\033[38;5;226m \\_\033[38;5;250m( ). \033[0m",
- "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
- " "],
- 'iconCloudy': [
- " ",
- "\033[38;5;250m .--. \033[0m",
- "\033[38;5;250m .-( ). \033[0m",
- "\033[38;5;250m (___.__)__) \033[0m",
- " "],
- 'iconVeryCloudy': [
- " ",
- "\033[38;5;240;1m .--. \033[0m",
- "\033[38;5;240;1m .-( ). \033[0m",
- "\033[38;5;240;1m (___.__)__) \033[0m",
- " "],
- 'iconLightShowers': [
- "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
- "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
- "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
- "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m",
- "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"],
- 'iconHeavyShowers': [
- "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m",
- "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m",
- "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m",
- "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m",
- "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"],
- 'iconLightSnowShowers': [
- "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
- "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
- "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
- "\033[38;5;255m * * * \033[0m",
- "\033[38;5;255m * * * \033[0m"],
- 'iconHeavySnowShowers': [
- "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m",
- "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m",
- "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m",
- "\033[38;5;255;1m * * * * \033[0m",
- "\033[38;5;255;1m * * * * \033[0m"],
- 'iconLightSleetShowers': [
- "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
- "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
- "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
- "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m",
- "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"],
- 'iconThunderyShowers': [
- "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
- "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
- "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
- "\033[38;5;228;5m ⚡\033[38;5;111;25m‘ ‘\033[38;5;228;5m⚡\033[38;5;111;25m‘ ‘ \033[0m",
- "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"],
- 'iconThunderyHeavyRain': [
- "\033[38;5;240;1m .-. \033[0m",
- "\033[38;5;240;1m ( ). \033[0m",
- "\033[38;5;240;1m (___(__) \033[0m",
- "\033[38;5;21;1m ‚‘\033[38;5;228;5m⚡\033[38;5;21;25m‘‚\033[38;5;228;5m⚡\033[38;5;21;25m‚‘ \033[0m",
- "\033[38;5;21;1m ‚’‚’\033[38;5;228;5m⚡\033[38;5;21;25m’‚’ \033[0m"],
- 'iconThunderySnowShowers': [
- "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
- "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
- "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
- "\033[38;5;255m *\033[38;5;228;5m⚡\033[38;5;255;25m *\033[38;5;228;5m⚡\033[38;5;255;25m * \033[0m",
- "\033[38;5;255m * * * \033[0m"],
- 'iconLightRain': [
- "\033[38;5;250m .-. \033[0m",
- "\033[38;5;250m ( ). \033[0m",
- "\033[38;5;250m (___(__) \033[0m",
- "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m",
- "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"],
- 'iconHeavyRain': [
- "\033[38;5;240;1m .-. \033[0m",
- "\033[38;5;240;1m ( ). \033[0m",
- "\033[38;5;240;1m (___(__) \033[0m",
- "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m",
- "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"],
- 'iconLightSnow': [
- "\033[38;5;250m .-. \033[0m",
- "\033[38;5;250m ( ). \033[0m",
- "\033[38;5;250m (___(__) \033[0m",
- "\033[38;5;255m * * * \033[0m",
- "\033[38;5;255m * * * \033[0m"],
- 'iconHeavySnow': [
- "\033[38;5;240;1m .-. \033[0m",
- "\033[38;5;240;1m ( ). \033[0m",
- "\033[38;5;240;1m (___(__) \033[0m",
- "\033[38;5;255;1m * * * * \033[0m",
- "\033[38;5;255;1m * * * * \033[0m"],
- 'iconLightSleet': [
- "\033[38;5;250m .-. \033[0m",
- "\033[38;5;250m ( ). \033[0m",
- "\033[38;5;250m (___(__) \033[0m",
- "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m",
- "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"],
- 'iconFog': [
- " ",
- "\033[38;5;251m _ - _ - _ - \033[0m",
- "\033[38;5;251m _ - _ - _ \033[0m",
- "\033[38;5;251m _ - _ - _ - \033[0m",
- " "],
- 'iconUnknown': [
- " .-. ",
- " __) ",
- " ( ",
- " `-’ ",
- " • "]
- }
- windDir = {
- "N": "\033[1m↓\033[0m",
- "NNE": "\033[1m↓\033[0m",
- "NE": "\033[1m↙\033[0m",
- "ENE": "\033[1m↙\033[0m",
- "E": "\033[1m←\033[0m",
- "ESE": "\033[1m←\033[0m",
- "SE": "\033[1m↖\033[0m",
- "SSE": "\033[1m↖\033[0m",
- "S": "\033[1m↑\033[0m",
- "SSW": "\033[1m↑\033[0m",
- "SW": "\033[1m↗\033[0m",
- "WSW": "\033[1m↗\033[0m",
- "W": "\033[1m→\033[0m",
- "WNW": "\033[1m→\033[0m",
- "NW": "\033[1m↘\033[0m",
- "NNW": "\033[1m↘\033[0m",
- }
- class Query(object):
- def __init__(self, day, city):
- self.day = day
- self.time = [3,4,5,6]
- self.weatherCode = ''
- self.weather = ''
- self.date = ''
- self.hourly = ''
- self.tempC = 0
- self.winddir16Point = ''
- self.windspeedKmph = 0
- self.humidity = 0
- self.chanceofwater = 0
- self.city = city
- def query(self):
- # 使用resquests
- # p={"q":"%s"%self.city, "num_of_days":3, "format":"json", "key":"55f1fdd05fba23be0a18043d0a017", "lang":"zh"}
- # response=requests.get(base_url,params=p)
- # json_string = response.text
- #使用urllib
- url = base_url + "?key=55f1fdd05fba23be0a18043d0a017&q=%s#_of_days=3&format=json⟨=zh" % self.city
- response = urllib.urlopen(url)
- json_string = response.read()
- parsed_json = json.loads(json_string)
- data = parsed_json['data'] # 获取所有数据
- try:
- self.weather = data['weather'][self.day] # 获取天气预报,[]内0代表当天,1代表明天,以此类推。
- except KeyError:
- print "\033[1;31;49m" + "请输入正确的城市或地区!" + "\033[0m"
- sys.exit()
- self.date = self.weather['date']
- def detail(self, time):
- self.hourly = self.weather['hourly'][time] # 获取小时数据,time:100-1500
- self.weatherCode = self.hourly['weatherCode']
- self.tempC = self.hourly['tempC']
- self.winddir16Point = self.hourly['winddir16Point']
- self.windspeedKmph = self.hourly['windspeedKmph']
- self.chanceofrain = self.hourly['chanceofrain']
- self.chanceofsnow = self.hourly['chanceofsnow']
- self.humidity = self.hourly['humidity']
- self.chanceofwater = int(self.chanceofrain) if int(self.chanceofrain) > int(self.chanceofsnow) else int(self.chanceofsnow)
- def printSingle(self):
- l1 = l2 = l3 = l4 = l5 = ''
- for time in self.time:
- self.detail(time)
- l1 += '│' + icons[codes[self.weatherCode]][0] + self.hourly['lang_zh'][0]['value'].encode("utf-8") + '\t\t' if len(self.hourly['lang_zh'][0]['value'].encode("utf-8")) <= 12 else '│' + icons[codes[self.weatherCode]][0] + self.hourly['lang_zh'][0]['value'].encode("utf-8") + '\t'
- l2 += '│' + icons[codes[self.weatherCode]][1] + temp_color(self.tempC) + "°C"+'\t\t'
- l3 += '│' + icons[codes[self.weatherCode]][2] + windDir[self.winddir16Point]+" "+ wind_color(self.windspeedKmph) + "km/h" + '\t\t'
- l4 += '│' + icons[codes[self.weatherCode]][3] + "降水概率:" + str(self.chanceofwater) + "%" + '\t'
- l5 += '│' + icons[codes[self.weatherCode]][4] + "湿度:" + str(self.humidity) + "%" + '\t\t'
- print l1+"│"
- print l2+"│"
- print l3+"│"
- print l4+"│"
- print l5+"│"
- def printDay(self, delta):
- date_time = datetime.strftime(datetime.today() + timedelta(days=delta),"%Y-%m-%d")
- line1 = " ┌─────────────┐ "
- line2 = "┌───────────────────────────────┬──────────────────────────%s───────────────────────────┬───────────────────────────────┐" % date_time
- line3 = "│ Morning │ Noon └──────┬──────┘ Evening │ Night │"
- line4 = "├───────────────────────────────┼───────────────────────────────┼───────────────────────────────┼───────────────────────────────┤"
- endline= "└───────────────────────────────┴───────────────────────────────┴───────────────────────────────┴───────────────────────────────┘"
- print line1
- print line2
- print line3
- print line4
- self.printSingle()
- print endline
- def temp_color(temp):
- if temp >= 35 or temp <= -10:
- color = "\033[1;31;49m" + str(temp) + "\033[0m"
- elif (temp >= 25 and temp <35):
- color = "\033[1;33;49m" + str(temp) + "\033[0m"
- elif temp > 10 and temp < 25:
- color = "\033[1;32;49m" + str(temp) + "\033[0m"
- elif temp >-10 and temp <= 10:
- color = "\033[1;34;49m" + str(temp) + "\033[0m"
- return color
- def wind_color(windspeed):
- if windspeed <= 5:
- color = "\033[1;32;49m" + str(windspeed) + "\033[0m"
- elif windspeed > 5 and windspeed <=10:
- color = "\033[1;33;49m" + str(windspeed) + "\033[0m"
- else:
- color = "\033[1;34;49m" + str(windspeed) + "\033[0m"
- return color
- def main():
- try:
- city = sys.argv[1]
- except IndexError:
- print "\033[1;31;49m" + "请输入您要查询的城市或地区:" + "\033[0m"
- city = raw_input()
- if city == '':
- sys.exit()
- day = [0,1,2]
- for i in day:
- query = Query(i,city)
- query.query()
- query.printDay(i)
- if __name__ == "__main__":
- main()
运行效果如图:
来源: http://www.phpxs.com/code/1004886/