오픈웨더맵 사이트에서는 날씨, 풍속, 풍향, 습도 등을 제공하고 있습니다.
api를 사용하여 오늘의 날씨, 내일의 날씨를 확인하는 코드를 파이썬으로 작성해 보겠습니다.
오픈웨더맵 사이트
회원가입하시고, 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()
실행 결과입니다.
'공학속으로 > python' 카테고리의 다른 글
[python] 안랩블로그 게시글 크롤링 (1) | 2024.12.09 |
---|---|
[Python] 네이버API를 사용한 뉴스 검색 크롤링하기 (5) | 2024.09.20 |
[Python] URL 목록 파일 이용한 파일 다운로드 (0) | 2024.07.16 |
[파이썬] 관리자 모드로 외부 프로그램 실행하기 GUI (1) | 2023.12.16 |
[파이썬] 파일 복사 GUI 형태로 만들기 (0) | 2023.12.16 |
댓글