공학속으로/python

[python] 날씨 api를 사용하여 날씨, 습도 구하기

더월드 2024. 12. 9.

오픈웨더맵 사이트에서는 날씨, 풍속, 풍향, 습도 등을 제공하고 있습니다.

api를 사용하여 오늘의 날씨, 내일의 날씨를 확인하는 코드를 파이썬으로 작성해 보겠습니다.

 

오픈웨더맵 사이트

http://openweathermap.org

 

회원가입하시고, api를 발급받습니다.

 

 

웹에서 구현한다면 아래와 같이 디자인된 페이지를 만들 수도 있습니다.

날씨 가져오기 (웹 버전)

 

하지만, 저희는 간단하게 현재 지역의 날씨를 가져오는 코드를 만들어 보겠습니다.

 

우선적으로 api 사용방법은 아래와 같은 형태입니다.

#위도, 경도로 현재 날씨 구하기
https://api.openweathermap.org/data/3.0/onecall?lat=33.44&lon=-94.04&appid={API key}

# 도시 이름으로 현재 날씨 구하기
https://api.openweathermap.org/data/2.5/weather?q={도시 이름}&appid={API 키}

# 도시 이름과 국가이름으로 현재 날씨 구하기
https://api.openweathermap.org/data/2.5/weather?q={도시 이름}, {국가 코드}&appid={API 키}

# 도시, 주 코드, 국가코드를 이용하여 현재 날씨 구하기
https://api.openweathermap.org/data/2.5/weather?q={도시 이름},{주 코드},{국가 코드}&appid={API 키}

 

이렇게 던졌을때, 주어진 위도, 경도(또는 도시이름)의 날씨를 가져옵니다.

 

서울 지역의 오늘의 날씨 구하는 파이썬 소스 코드입니다.

import requests
import time
from datetime import datetime, timedelta

OWM_API_KEY = '367~~~~~~~~~~~~~~~~~~~~~~~9d1'
    
def get_weather_data(city='Seoul', units='metric'):
    base_url = "http://api.openweathermap.org/data/2.5/weather"
    params = {
        'q': city,
        'appid': OWM_API_KEY,
        'units': units
    }
    response = requests.get(base_url, params=params)
    weather_data = response.json()
    return weather_data

def get_forecast_weather_data(city='Seoul', units='metric'):
    base_url = "http://api.openweathermap.org/data/2.5/forecast"
    params = {
        'q': city,
        'appid': OWM_API_KEY,
        'units': units
    }
    response = requests.get(base_url, params=params)
    forecast_data = response.json()
    return forecast_data
    
def get_air_pollution_data(lat, lon):
    base_url = "http://api.openweathermap.org/data/2.5/air_pollution"
    params = {
        'lat': lat,
        'lon': lon,
        'appid': OWM_API_KEY
    }
    response = requests.get(base_url, params=params)
    air_pollution_data = response.json()
    return air_pollution_data

def classify_pm2_5(pm2_5):
    if pm2_5 <= 15:
        return "좋음"
    elif pm2_5 <= 35:
        return "나쁨"
    else:
        return "아주 나쁨"
        
def print_weather_info():
    weather_data = get_weather_data(city='Seoul')
    temp = weather_data['main']['temp']
    humidity = weather_data['main']['humidity']
    lat = weather_data['coord']['lat']
    lon = weather_data['coord']['lon']
    weather_description = weather_data['weather'][0]['description']
    weather_icon = weather_data['weather'][0]['icon']
    weather_icon_url = f"http://openweathermap.org/img/wn/{weather_icon}.png"

    air_pollution_data = get_air_pollution_data(lat, lon)
    pm2_5 = air_pollution_data['list'][0]['components']['pm2_5']
    pm2_5_status = classify_pm2_5(pm2_5)
 
    current_date = datetime.now().strftime('%Y-%m-%d')
    
    print(f"\n[{current_date}] - 서울날씨")
    print(f"날씨: {weather_description}")
    print(f"{weather_icon_url}")
    print(f"온도: {temp}°C, 습도: {humidity}%")
    print(f"미세먼지(PM2.5): {pm2_5} µg/m³ ({pm2_5_status})")
 
def main():
    print_weather_info()

if __name__ == "__main__":
    main()

 

위 코드를 실행한 결과 입니다.

 

서울 지역의 내일의 날씨 구하는 파이썬 소스코드입니다.

import requests
import time
from datetime import datetime, timedelta

OWM_API_KEY = '367a~~~~~~~~~~~~~~~9d1'
    
def get_forecast_weather_data(city='Seoul', units='metric'):
    base_url = "http://api.openweathermap.org/data/2.5/forecast"
    params = {
        'q': city,
        'appid': OWM_API_KEY,
        'units': units
    }
    response = requests.get(base_url, params=params)
    forecast_data = response.json()
    return forecast_data  
        
def print_weather_info():   
    # 내일 날씨 예보 가져오기
    forecast_weather = get_forecast_weather_data(city='Seoul')
    tomorrow_date = (datetime.now() + timedelta(days=1)).strftime('%Y-%m-%d')

    for forecast in forecast_weather['list']:
        forecast_date = forecast['dt_txt'].split(' ')[0]
        if forecast_date == tomorrow_date:
            forecast_temp = forecast['main']['temp']
            forecast_humidity = forecast['main']['humidity']
            forecast_description = forecast['weather'][0]['description']
            forecast_icon = forecast['weather'][0]['icon']
            forecast_icon_url = f"http://openweathermap.org/img/wn/{forecast_icon}.png"
            break

    print(f"\n[{tomorrow_date}] - 내일 서울 날씨")
    print(f"예상 온도: {forecast_temp}°C, 습도: {forecast_humidity}%")
    print(f"예상 날씨: {forecast_description}")
    print(f"{forecast_icon_url}")

def main():
    print_weather_info()

if __name__ == "__main__":
    main()

 

위 코드를 실행한 결과입니다.

 

1분 마다 서울 지역의 오늘과 내일의 날씨를 가져오는 전체 코드는 아래와 같습니다.

import requests
import time
from datetime import datetime, timedelta

OWM_API_KEY = '367a~~~~~~~~~~~~~~~~~~~~9d1'
    
def get_weather_data(city='Seoul', units='metric'):
    base_url = "http://api.openweathermap.org/data/2.5/weather"
    params = {
        'q': city,
        'appid': OWM_API_KEY,
        'units': units
    }
    response = requests.get(base_url, params=params)
    weather_data = response.json()
    return weather_data

def get_forecast_weather_data(city='Seoul', units='metric'):
    base_url = "http://api.openweathermap.org/data/2.5/forecast"
    params = {
        'q': city,
        'appid': OWM_API_KEY,
        'units': units
    }
    response = requests.get(base_url, params=params)
    forecast_data = response.json()
    return forecast_data
    
def get_air_pollution_data(lat, lon):
    base_url = "http://api.openweathermap.org/data/2.5/air_pollution"
    params = {
        'lat': lat,
        'lon': lon,
        'appid': OWM_API_KEY
    }
    response = requests.get(base_url, params=params)
    air_pollution_data = response.json()
    return air_pollution_data

def classify_pm2_5(pm2_5):
    if pm2_5 <= 15:
        return "좋음"
    elif pm2_5 <= 35:
        return "나쁨"
    else:
        return "아주 나쁨"
        
def print_weather_info():
    weather_data = get_weather_data(city='Seoul')
    temp = weather_data['main']['temp']
    humidity = weather_data['main']['humidity']
    lat = weather_data['coord']['lat']
    lon = weather_data['coord']['lon']
    weather_description = weather_data['weather'][0]['description']
    weather_icon = weather_data['weather'][0]['icon']
    weather_icon_url = f"http://openweathermap.org/img/wn/{weather_icon}.png"

    air_pollution_data = get_air_pollution_data(lat, lon)
    pm2_5 = air_pollution_data['list'][0]['components']['pm2_5']
    pm2_5_status = classify_pm2_5(pm2_5)
    
    current_date = datetime.now().strftime('%Y-%m-%d')

    print(f"\n[{current_date}] - 서울날씨")
    print(f"날씨: {weather_description}")
    print(f"{weather_icon_url}")
    print(f"온도: {temp}°C, 습도: {humidity}%")
    print(f"미세먼지(PM2.5): {pm2_5} µg/m³ ({pm2_5_status})")
    
    # 내일 날씨 예보 가져오기
    forecast_weather = get_forecast_weather_data(city='Seoul')
    tomorrow_date = (datetime.now() + timedelta(days=1)).strftime('%Y-%m-%d')

    for forecast in forecast_weather['list']:
        forecast_date = forecast['dt_txt'].split(' ')[0]
        if forecast_date == tomorrow_date:
            forecast_temp = forecast['main']['temp']
            forecast_humidity = forecast['main']['humidity']
            forecast_description = forecast['weather'][0]['description']
            forecast_icon = forecast['weather'][0]['icon']
            forecast_icon_url = f"http://openweathermap.org/img/wn/{forecast_icon}.png"
            break

    print(f"\n[{tomorrow_date}] - 내일 서울 날씨")
    print(f"예상 온도: {forecast_temp}°C, 습도: {forecast_humidity}%")
    print(f"예상 날씨: {forecast_description}")
    print(f"{forecast_icon_url}")

def main():
    last_checked_date = None

    while True:
        current_date = datetime.now().date()
        
        if last_checked_date != current_date:
            print_weather_info()
            last_checked_date = current_date

        time.sleep(60)  # 60초마다 현재 시간을 확인

if __name__ == "__main__":
    main()

 

실행 결과입니다.

댓글

💲 추천 글