Python脚本获取城市天气
2015-10-19
Python 已有1907人围观

    网上看到的一段Python实现的获取城市天气的代码,供大家娱乐参考。。最初看到这段Python脚本的地方已经忘了,原始的GO实现的版本地址:https://github.com/schachmat/wego



    具体代码如下:

#!/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&num_of_days=3&format=json&lang=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()


    运行效果如图:


weather


Over!

本文地址:http://xianglong.me/article/get-city-weather-using-python-script/

特别声明:本站文章,如非注明,皆为降龙原创。转载需注明本文链接并保证链接可用。