requests
라이브러리를 사용하여 API에 요청을 보낼 수 있음import requests
url = "https://api.example.com/data" # 예제 API URL
params = {
"key": "YOUR_API_KEY", # API 키 (실제 키로 교체)
"parameter1": "value1", # 예시 파라미터 값
"parameter2": "value2" # 예시 파라미터 값
}
response = requests.get(url, params=params)
data = response.json() # JSON 응답을 Python 딕셔너리로 변환
print(data)
# 예제 데이터가 {'name': 'John', 'age': 30, 'location': 'Seoul'} 형식이라고 가정
name = data.get('name')
# data['name']도 가능 → API가 제공하는 데이터는 형식이 갖춰져 있어서 쉽게 접근 가능
age = data.get('age')
location = data.get('location')
print(f"이름: {name}, 나이: {age}, 위치: {location}")
https://openweathermap.org/current#name
https://openweathermap.org/current#example_JSON
https://api.openweathermap.org/data/2.5/weather?q=
{city name}&appid=
{API key}
: 물음표 다음에 나오는 게 파라미터
둘 다 똑같은 결과 나오지만 적는 방법이 두 개로 나눠짐 → 우리는 2번째 사용
API_KEY
저장
templete.env
파일 열고 API_KEY = '...'의 ... 대신 Key 넣고.env
로 파일 이름 수정하기
- 터미널에서 해당 파일이 있는 경로로 이동한 뒤
mv template.env .env
해도 됨- .env 파일 쓰는 이유
- 유료 계정을 전체 공개해 버리면 다른 사람이 다 쓰잖아요…
🡆 dotenv로 불러와서 사용하면 보안상 좋음
.env 저장이 곤란하신 분들은 terminal 이나 command prompt 에서 아래와 같이 입력해서 만들어주세요.
폴더는 현재 챌린지 수업 자료 ipynb 폴더랑 동일해야됩니다. (pwd 로 확인)
... 말고 실제 키를 입력해주세요
<mac / 리눅스 환경>
echo 'API_KEY="..."' > .env
< windows 환경 >
echo API_KEY="..." > .env
Jupyter 노트북에서 401 오류 뜨시면 .env 파일 다시 저장해주시고 노트북을 꼭 restart 한 다음에 코드를 돌려주세요!
requests
를 활용하여 OpenWeather API에 요청을 보내고 응답 가져오기import requests
import pandas as pd
import os
from dotenv import load_dotenv
load_dotenv()
# OpenWeather API 요청을 위한 기본 설정
# (https://openweathermap.org/api/one-call-3#current)
# 첫 번째 방법
api_key = os.environ.get('API_KEY') # 본인의 API 키를 입력하세요.
city_name = "Seoul" # 도시는 "서울"로 설정
url = f"http://api.openweathermap.org/data/2.5/weather?q={city_name}&units=metric&appid={api_key}"
response = requests.get(url)
# 두 번째 방법
api_key = os.environ.get('API_KEY') # 본인의 API 키를 입력하세요.
city_name = "Seoul" # 도시는 "서울"로 설정
params = {
"q": city_name,
"units": "metric",
"appid": api_key
}
url = "http://api.openweathermap.org/data/2.5/weather"
response = requests.get(url, params=params)
# API 응답 데이터 처리
data = response.json()
# 간단한 Pandas 전처리 수행
df_weather = pd.json_normalize(data) # JSON 데이터를 Pandas 형태로 변환(테이블화)
df_weather["measured_at"] = pd.to_datetime(df_weather["dt"], unit="s") + pd.Timedelta(hours=9) # 기준시간
df_weather["dt"] = df_weather["measured_at"].dt.strftime('%Y%m%d') # 기준년월일 (YYYYMMDD)
df_weather["time"] = df_weather["measured_at"].dt.strftime('%H%M%S') # 기준년월일 (HHHHMMSS)
df_selected = df_weather[["dt", "time", "measured_at", "id", "name", "main.temp", "main.humidity", "wind.speed"]]
df_selected = df_selected.rename( # 컬럼명 수정
columns={"name": "city", "main.temp": "temperature", "main.humidity": "humidity", "wind.speed": "wind_speed"}
)
df_selected
pd.Timedelta(hours=9)
import pandas as pd
# 데이터 준비
df = pd.DataFrame(df_selected)
df.to_csv('weather_api.csv', index=False)
print("날씨 정보가 CSV 파일로 저장되었습니다.")
https://github.com/dl0312/open-apis-korea
import requests
class WeatherApiClient:
"""
OpenWeatherMap API 클라이언트를 사용하여 날씨 데이터를 가져오는 클래스입니다.
"""
def __init__(self, api_key: str):
self.base_url = "http://api.openweathermap.org/data/2.5"
if api_key is None:
raise Exception("API 키는 None으로 설정할 수 없습니다.")
self.api_key = api_key
def get_city(self, city_name: str, temperature_units: str = "metric") -> dict:
"""
지정된 도시의 최신 날씨 데이터를 가져옵니다.
Parameters:
- city_name (str): 날씨 정보를 조회할 도시 이름.
- temperature_units (str): 온도 단위 (기본값은 'metric'으로 섭씨 기준).
'metric'은 섭씨, 'imperial'은 화씨, 'standard'는 켈빈 단위를 의미합니다.
Returns:
- dict: 요청한 도시의 날씨 데이터가 포함된 JSON 응답을 반환합니다.
Raises:
- Exception: API 요청이 실패한 경우 상태 코드와 응답 메시지와 함께 예외가 발생합니다.
"""
params = {"q": city_name, "units": temperature_units, "appid": self.api_key}
response = requests.get(f"{self.base_url}/weather", params=params)
if response.status_code == 200:
return response.json()
else:
raise Exception(
f"Open Weather API에서 데이터를 추출하지 못했습니다. 상태 코드: {response.status_code}. 응답: {response.text}"
)
import pandas as pd
from dotenv import load_dotenv
import os
load_dotenv()
weather_api_client = WeatherApiClient(api_key = os.environ.get("API_KEY"))
data = weather_api_client.get_city("Seoul")
# 간단한 전처리
df_weather = pd.json_normalize(data) # JSON 데이터를 Pandas 형태로 변환
df_weather["measured_at"] = pd.to_datetime(df_weather["dt"], unit="s") # 기준시간
df_weather["dt"] = df_weather["measured_at"].dt.strftime('%Y%m%d') # 기준년월일 (YYYYMMDD)
df_weather["time"] = df_weather["measured_at"].dt.strftime('%H%M%S') # 기준년월일 (HHHHMMSS)
df_selected = df_weather[["dt", "time", "measured_at", "id", "name", "main.temp", "main.humidity", "wind.speed"]]
df_selected = df_selected.rename( # 컬럼명 수정
columns={"name": "city", "main.temp": "temperature", "main.humidity": "humidity", "wind.speed": "wind_speed"}
)
# DataFrame 생성 및 CSV 파일로 저장
df = pd.DataFrame(df_selected)
df.to_csv('weather_api.csv', index=False)
OpenWeather API 회원가입 후 받은 API_KEY로 sydney에 대한 다른 정보도 출력하기