獲取城市天氣的Python腳本

jopen 9年前發布 | 2K 次閱讀 Python JavaScript

一段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()

運行效果如圖:

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!