오픈웨더맵 사이트에서는 날씨, 풍속, 풍향, 습도 등을 제공하고 있습니다.
api를 사용하여 오늘의 날씨, 내일의 날씨를 확인하는 코드를 파이썬으로 작성해 보겠습니다.
오픈웨더맵 사이트
회원가입하시고, api를 발급받습니다.
![[python] 날씨 api를 사용하여 날씨, 습도 구하기 [python] 날씨 api를 사용하여 날씨, 습도 구하기](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
웹에서 구현한다면 아래와 같이 디자인된 페이지를 만들 수도 있습니다.
![[python] 날씨 api를 사용하여 날씨, 습도 구하기 [python] 날씨 api를 사용하여 날씨, 습도 구하기](https://blog.kakaocdn.net/dn/cbjF1k/btsLdGOzAtM/vz2mlspKARknTVReBZH4I1/img.png)
하지만, 저희는 간단하게 현재 지역의 날씨를 가져오는 코드를 만들어 보겠습니다.
우선적으로 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()
위 코드를 실행한 결과 입니다.
![[python] 날씨 api를 사용하여 날씨, 습도 구하기 [python] 날씨 api를 사용하여 날씨, 습도 구하기](https://blog.kakaocdn.net/dn/MwsLq/btsLcoVUOrw/TwXCyTsB05arEtYz6nEn81/img.png)
서울 지역의 내일의 날씨 구하는 파이썬 소스코드입니다.
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()
위 코드를 실행한 결과입니다.
![[python] 날씨 api를 사용하여 날씨, 습도 구하기 [python] 날씨 api를 사용하여 날씨, 습도 구하기](https://blog.kakaocdn.net/dn/Ls44Y/btsLbvVC0AA/2TLH3D6MK2NJKCEjQsyrb1/img.png)
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] 날씨 api를 사용하여 날씨, 습도 구하기 [python] 날씨 api를 사용하여 날씨, 습도 구하기](https://blog.kakaocdn.net/dn/kEvJM/btsLbaEbkvp/yzpDgkMYHT0U2ksMI3vkHK/img.png)
'공학속으로 > python' 카테고리의 다른 글
[python] 안랩블로그 게시글 크롤링 (1) | 2024.12.09 |
---|---|
[Python] 네이버API를 사용한 뉴스 검색 크롤링하기 (5) | 2024.09.20 |
[Python] URL 목록 파일 이용한 파일 다운로드 (0) | 2024.07.16 |
[파이썬] 관리자 모드로 외부 프로그램 실행하기 GUI (1) | 2023.12.16 |
[파이썬] 파일 복사 GUI 형태로 만들기 (1) | 2023.12.16 |
댓글