=> 마이페이지 들어가서 위의 APIkey 누르면 발급된 api key 확인 가능
=> 형광펜 표시해놓은 아이로 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라는 글자 자체로 요청보내게 됨
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 이상 버전 지원
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)
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 형식으로 변경하자
사전 문법 활용하기
사전대상["key"]
값을 호출하면 이에 해당하는 값들이 호출- 이때 해당하는 값들이 여러개라면 인덱스로 지정하는 것이 가능
- 사전 안에 사전이 있다면
사전대상1["사전대상1의key"][0]["사전대상1의ket의 값에 속하는 key들 중 원하는 것"]
으로 불러오면 됨
정보
최저 기온 : main - temp_min
최고 기온 : main - temp_max
습도 : main - humidity
기압 : main - pressure
풍향 : wind - deg
풍속 : wind - speed
(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 수행 결과 비교
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"],"입니다.")
["weather"][0]
인 거고 그 안의 description 이라는 키를 가지는 아이의 값을 데리고 오고 싶다면 ["weather"][0]["description]
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}"
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"],"입니다.")