ㅁ 개요
O 프로그램 소개
- 이번 글은 이전글(2022.12.11 - [분류 전체보기] - (프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 1. 날씨 정보 실시간 받아오기 - 1) API사용을 위한 회원가입)에 이은 3번째 글로 회원가입을 통해 얻은 API 키를 이용하여 날씨 관련 정보를 수집하는 방법에 대하여 설명합니다.
아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.
관련 2번째 영상
O 완성된 프로그램 실행 화면
아래와 같이 프로그램 실행 시 API서버로 부터 날씨 관련 정보를 얻어 옵니다. 여기서 우리는 여러가지 정보/데이터 중에서 필요한 것(기상정보, 온도, 습도, 기압 풍향 등) 만 취하여 표시하였습니다.
아래 빨간 박스의 결과는 이전 소개글에서 말씀드렸던 텔레그램 메신저에서 받았던 내용과 거의 유사합니다.

O 시작전 준비 사항
- 이번글을 실습하기 위해서는 이전글(2022.12.11 - [분류 전체보기] - (프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 1. 날씨 정보 실시간 받아오기 - 1) API사용을 위한 회원가입)의 API 키가 있어야 합니다.
ㅁ 세부 내용
O 완성된 소스
소스파일 : 6.py
import requests
apikey = "" # 본인의 API를 넣어주세요
city = "Seoul"
lang = "kr"
url = f"http://api.openweathermap.org/geo/1.0/direct?q={city}&appid={apikey}"
# url = f"http://api.openweathermap.org/geo/1.0/direct?q={city}&appid={apikey}&lang={lang}"
result = requests.get(url)
print(result.text,type(result.text), "\n\n")
response = requests.get(url).json()
print(response,type(response), "\n\n")
print(response[0]['name'])
print(response[0]['lat'])
print(response[0]['lon'])
lat = response[0]['lat']
lon = response[0]['lon']
full_Url = f"https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={apikey}&lang={lang}&units=metric"
response_org = requests.get(full_Url).json()
print(response_org,"\n\n")
print(response_org["name"],"의 날씨입니다.")
print("날씨 : ",response_org["weather"][0]["description"])
print("현재 온도 : ",response_org["main"]["temp"])
print("체감 온도 : ",response_org["main"]["feels_like"])
print("최저 기온 : ",response_org["main"]["temp_min"])
print("최고 기온 : ",response_org["main"]["temp_max"])
print("습도 : ",response_org["main"]["humidity"])
print("기압 : ",response_org["main"]["pressure"])
print("풍향 : ", response_org["wind"]["deg"])
print("풍속 : ", response_org["wind"]["speed"])
O 소스 실행 방법
O 주요 내용
1. API 사용법을 알아내기 위해 우리는 아래 사이트에서 'Current Weather Data' > 'API doc'를 클릭 합니다.

2. 사용법은 아래와 같으며, 우리가 알아야 하는 값은 위도(lat)와 경도(lon)이며, api key는 이미 회원가입 후 얻었습니다.
위도와 경도에 대한 자세한 내용은 아래 (2)번을, 언어(lang)에 대한 부분은 (3)번을 클릭하시면 세부 내용을 보실 수 있습니다.

3. 위에서 (2)번을 클릭하면 아래 화면이 나타납니다.
우리는 위의 2번 API요청을 하기 위해서 아래 추가적인 API 요청을 통해서 위도(lat)와 경도(lon) 값을 알아낼 것입니다.

4. 위의 2번에서 (3)번을 클릭하면 lang에 대한 정보를 아래와 같이 볼 수 있으며, 우리는 대한민국의 날씨 정보를 얻어올 것이기 때문에 아래 'kr'을 사용할 것입니다.
lang = 'kr'

5. 그리고 'Seoul' 등 도시 정보를 확인하기 위해서는 아래와 같이 'ISOO 3166 country codes'를 확인해야 합니다.

6. 구글링을 통해 확인한 결과 아래와 같이 위키피디아에서 그 정보를 확인할 수 있으며, 우리는 'Seoul' 뿐만아니라, 아래 지역명을 사용하여 날씨를 조회할 수 있습니다.

7. 위에서 설명 드린 바와 같이 우리는 먼저 위도(lat)와 경도(lon) 정보를 얻어야 하며, 그렇게 하기 위해서 아래 코드와 같이 작성합니다.

8. 위 코드의 실행 결과는 다음과 같습니다.
자세히 보시면 끝 부분에 lat 값과, lon 값이 있는 것을 확인 할 수 있습니다.
이 값을 아래 URL에 넣어 줘야 합니다.
https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={apikey}"

9. 우리는 위에서 실행한 결과 중 lat와 lon을 가져오기 위해 일단, 결과값이 어떤 타입인지 확인해야 합니다.
아래와 같이 코드를 추가합니다.

10. 실행 결과를 보니 위의 코드에서 requests.get(url)로 받은 결과는 스트링(str), requests.get(url).json()으로 받은 결과를 리스트(list)입니다.

11. 됬습니다. 이제 우리는 리스트로 값을 받아올 수 있으므로, 아래 코드와 같이 특정 필요한 정보만 얻어 올 수 있도록 코드를 추가합니다.
[{ <-- 리스트([) 안에 딕셔너리({)가 또 들어 있습니다. 따라서 가져올때 아래와 같이 표현해 주어야 합니다.
response[0] <---리스트를 가져올때(response의 첫번째 요소를 가져옴)
response[0]['name'] <-- 딕셔너리를 가져올때(키/벨류 구조로 'name' 키에 해당하는 값(벨류->Seoul)을 가져옴 )

12. 실행결과는 아래와 같습니다.
아래 자세히 보시면 값을 제대로 가져온 것을 확인할 수 있습니다.
name -> Seoul
lat ->37.56xxx
lon ->26.97xxx

13. 이제 원래 우리가 하려고 했던 날씨 정보를 얻어오기 위한 API 요청을 위해서 print()문으로 찍어봤던 위도(lat)와 경도(lon)를 변수에 담아두고, 이를 url에 추가해 줍니다.
https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={apikey}"
아래 소스에서는 lang와 units이 추가되었는데, lang는 언어 부분으로 'kr'이 한글을 표현해 줍니다.
그리고 units은 온도 표현 방식으로 units=metric로 하면 섭씨(우리가 사용하는 온도 방식)로 나타내어 줍니다.

14. 실행결과 뭔가 날씨에 대한 정보가 나온것을 알 수 있습니다.
한글('맑음' 등)도 잘 나타나고 있고요, 온도도 섭씨로 잘 표현되어 나왔습니다.

15. 마지막으로 위의 API 응답값 중에서 필요한 부부만 뽑아내서 보고 싶으므로, 아래 코드와 같이 추가해 줍니다.

16. 실행 결과는 아래와 같이 '날씨', '온도', '습도' 등 원하는 내용만 골라올 수 있었습니다.

O 소스 분석
- 위의 '주요'내용' 참고
ㅁ 정리
O 우리가 배운 내용
오늘은 여기까지이며, 위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.
감사합니다.
'파이썬 프로젝트 및 응용 > 매일 아침 출근전 나만의 날씨 정보를 받아보자!!' 카테고리의 다른 글
(프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 2. 텔레그렘으로 데이터 전송하기 - 2) 텔레그램 봇에게 날씨 정보 보내기 (0) | 2022.12.20 |
---|---|
(프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 2. 텔레그렘으로 데이터 전송하기 - 1) 텔레그램 봇 생성 (0) | 2022.12.20 |
(프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 1. 날씨 정보 실시간 받아오기 - 3) 16일 예상치 날씨 데이터 받아오기 (2) | 2022.12.18 |
(프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 1. 날씨 정보 실시간 받아오기 - 1) API사용을 위한 회원가입 (0) | 2022.12.18 |
(프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 0. 소개 (0) | 2022.12.12 |