Python 복습 002 | 파이썬 날씨 정보 받아오기(API 활용)

28485 단어 파이썬파이썬

파이썬 날씨 정보 받아오기(API 활용)

1) 사이트 회원가입

Openweathermap 사이트 주소

=> 마이페이지 들어가서 위의 APIkey 누르면 발급된 api key 확인 가능

2) API 의 개념

  • API : Application Programming Interface
  • "키보드","마우스"는 인간과 컴퓨터 이어줄 인터페이스
  • "API" 도 키보드, 마우스와 같이 인간과 컴퓨터를 이어주는 역할을 수행
    => 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면, 즉, 서로 다른 두 개의 시스템을 연결해 주는 것
    => 프로그램과 프로그램을 이어주는 연결고리
  • API를 만든다 : 사람이 필요한 기능을 만들어놓고, 규약에 맞춰서 열어놓는 것

3) API KEY

  • API를 사용할 때 남겨두는 방명록 => API KEY

4) API 링크 만들기

  • 우리가 사용할 서비스는 맨 좌측에 있는 서비스!

서비스

=> 형광펜 표시해놓은 아이로 API를 호출하는 것이 가능하다

api = "http://api.openweathermap.org/data/2.5/weather?q={city}&appid={apikey}&lang={lang}&units=metric"

=> 근데 이대로 api를 call하게 되면 city name이라는 글자와 your api key라는 글자 자체로 요청보내게 됨

  • 응답을 원하는 API 주소로 요청을 보내는 것을 API를 call, 부른다고 함
  • Python의 f-string이라는 것을 이용해서 링크 안에 변수를 집어넣기 가능
city = "Seoul"
apikey = "################################"

api = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={apikey}"

파이썬 f 스트링
python의 f-string을 사용하면 문자열 사이에 변수를 포맷팅

  • 사용을 원하는 문자열 앞에 f 를 써 줍니다. 해당 문자열에 f-string 사용할 것임을 알려줌
  • 변수 사용을 원하는 위치에 중괄호 넣고 집어넣고 싶은 데이터 써주는 것
  • python 3.6 이상 버전 지원

4) API 호출하기

http://api.openweathermap.org/data/2.5/weather?q={city}&appid={apikey}

=> ~weather 이라는 주소로 요청을 보내면서 우리가 설정한 city와 apikey를 정보 또한 함께 보내는 것

import requests

apikey = "################################"
city = "Seoul"

api = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={apikey}"

위와 같이 api 호풀을 한 뒤 응답을 받아와야 함

=> requests 를 통해서 요청을 받아오면 된다

result = requests.get(api)
print(result.text)

weather conditions 볼 수 있는 곳

5) json 방식으로 출력해오기

  • 우리가 받은 response는 문자열
  • 이 중에서 원하는 정보만 뽑아오기 위한 쉬운 방법 => json 모듈 사용

5-1 )json import 해오기

import json

그리고 데이터를 json 파일로 바꾸기

일반 문자열을 json 타입으로 변경 방법

json.loads() => 괄호 안에 타입 변경할 문자열 넣어주기

import requests
import json

apikey = "~~"
city = "Seoul"

api = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={apikey}"

result = requests.get(api)
print("json 데이터 변환 전")
print(result.text)
data = json.loads(result.text)
print("\njson 데이터 변환 후")
print(data)


=> 보기에는 별다른게 없음

print("\njson :",data["weather"])
print("\nstr :",result.text["weather"])

=> 근데 위와 같은 코드로 출력하면 json 으로 변환한 아이는 오케이인데 아래 친구는 오류가 난다.
=> 왜냐하면 json 파일은 사전 자료형이고 text는 문자 자료형이기 때문

json 파일 탐구

{
   "좌표": {
      "경도": 126.98,
      "위도": 37.57
   },
   "날씨": [
      {
         "날씨 아이디": 800,
         "날씨": "Clear",
         "설명": "clear sky",
         "아이콘 아이디": "01d"
      }
   ],
   "base": "stations",
   "메인 정보": {
      "온도": 300.75,
      "사람이 느끼는 온도": 300.38,
      "최저 기온": 300.15,
      "최고 기온": 301.15,
      "기압 ": 1004,
      "습도": 44
   },
   "시야값": 10000,
   "바람": {
      "풍속": 2.45,
      "풍향": 267
   },
   "구름": {
      "구름 비율": 1
   },
   "데이터 계산 시간": 1594798855,
   "sys": {
      "type": 1,
      "id": 8117,
      "국가 코드": "KR",
      "일출 시간": 1594758150,
      "일몰 시간": 1594810389
   },
   "timezone": 32400,
   "도시 id": 1835848,
   "도시 이름": "Seoul",
   "cod": 200
}
  • 위와 같은 코드로 응답이 넘어옴
    보기에는 사전형 같지만 str 임
    그래서 저 응답을 json.loads를 통해서 json으로 변경시켜주면
    dict 형태로 사용하는 것이 가능, 이를 통해서 데이터 불러오기
  • 그럼 dict 형태니깐 dict로 바꿔서 사용해도 되지 않냐고 생각이 들 수도 있겠지만
    보내준 형식이 json 형식이므로 그냥 안전하게 json 형식으로 변경하자

6) 원하는 정보만 불러오는 방법

사전 문법 활용하기

  • 사전대상["key"] 값을 호출하면 이에 해당하는 값들이 호출
  • 이때 해당하는 값들이 여러개라면 인덱스로 지정하는 것이 가능
  • 사전 안에 사전이 있다면 사전대상1["사전대상1의key"][0]["사전대상1의ket의 값에 속하는 key들 중 원하는 것"] 으로 불러오면 됨

정보
최저 기온 : main - temp_min
최고 기온 : main - temp_max
습도 : main - humidity
기압 : main - pressure
풍향 : wind - deg
풍속 : wind - speed

  • 우리가 알고자 하는 정보 : key 값 - key안의 key 값

(ex) 우리가 받아온 json 데이터들 (data 라는 변수로 받아왔음) 안에 있는 main 이란 아이 안의 temp 를 출력하고 싶다면 !?

1) print("\n1 :",data["main"],"\n")

=> data 안에서 main 을 키 값으로 가지는 아이 출력

2) print("\n2 :",data["main"]["temp"],"\n")

=> data 안에서 main을 키 값으로 가지고 main 안에서 temp를 키 값으로 가지는 아이 출력

원래 데이터, 1 수행 결과 , 2 수행 결과 비교

6-1 ) 위의 다양한 정보 출력 결과 코드

import requests
import json

apikey = "~"
city = "Seoul"

api = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={apikey}"

result = requests.get(api)
# json 타입으로 변환
data = json.loads(result.text)

print(data["name"],"의 날씨입니다.")
print("날씨는 ",data["weather"][0]["description"],"입니다.")
print("현재 온도는 ",data["main"]["temp"],"입니다.")
print("하지만 체감 ",data["main"]["feels_like"],"일 거에요.")
print("최저 기온은 ",data["main"]["temp_min"],"입니다.")
print("최고 기온은 ",data["main"]["temp_max"],"입니다.")
print("습도는 ",data["main"]["humidity"],"입니다.")
print("기압은 ",data["main"]["pressure"],"입니다.")
print("풍향은 ", data["wind"]["deg"],"입니다.")
print("풍속은 ", data["wind"]["speed"],"입니다.")

  • weater 만 좀 자세히 보면 리스트화 되어 있고 weather의 0번째 인덱스가 저 빨간 줄 범위이다. 따라서 저 빨간줄 범위 전체를 가져오려면 ["weather"][0] 인 거고 그 안의 description 이라는 키를 가지는 아이의 값을 데리고 오고 싶다면 ["weather"][0]["description]

7) 언어와 온도 단위 바꾸기

7-1 ) 언어 단위 바꾸기

  • api 호출 시 language 값을 추가하면, 날씨의 설명이 한국어로 출력

lang = "원하는 언어" 추가

호출하는 코드에도 &lang={lang} 을 추가 시켜주기 - 제공하는 언어들 예시
weatheropenapi 언어 제공 링크

apikey = "~"
city = "Seoul"
lang = "kr"

api = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={apikey}&lang={lang}"

7-2 ) 온도 단위 바꾸기

  • api 호출 시 units을 imperial 로 작성시 K(켈빈)
    -metric 으로 작성시 섭씨 (°C)로 온도가 출력
import requests
import json

apikey = "b~"
city = "Seoul"
lang = "kr"

api = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={apikey}&lang={lang}&units=metric"

result = requests.get(api)
# json 타입으로 변환
data = json.loads(result.text)

print(data["name"],"의 날씨입니다.")
print("날씨는 ",data["weather"][0]["description"],"입니다.")
print("현재 온도는 ",data["main"]["temp"],"입니다.")
print("하지만 체감 ",data["main"]["feels_like"],"일 거에요.")
print("최저 기온은 ",data["main"]["temp_min"],"입니다.")
print("최고 기온은 ",data["main"]["temp_max"],"입니다.")
print("습도는 ",data["main"]["humidity"],"입니다.")
print("기압은 ",data["main"]["pressure"],"입니다.")
print("풍향은 ", data["wind"]["deg"],"입니다.")
print("풍속은 ", data["wind"]["speed"],"입니다.")
  • 아래 코드 중 위는 켈빈 기준, 밑은 섭씨(units=metric) 기준이다

좋은 웹페이지 즐겨찾기