CONTNETNS
SUMMARY
1. API(Application Programming Interface)란 무엇인가?
:서로 다른 소프트웨어 시스템이 통신할 수 있도록 도와주는 인터페이스.
데이터 분석에서는 웹사이트나 서버에서 제공하는 데이터를 API를 통해 요청하여 쉽게 가져올 수 있고, 일반적으로 JSON 형식으로 데이터를 응답하며, 이를 파싱하여 원하는 형태로 처리할 수 있다.
데이터분석가에게 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)
*예제: JSON 데이터에서 특정 값 추출하기
# 예제 데이터가 {'name': 'John', 'age': 30, 'location': 'Seoul'} 형식이라고 가정
name = data.get('name')
age = data.get('age')
location = data.get('location')
print(f"이름: {name}, 나이: {age}, 위치: {location}")
🌍 실습: OpenWeather API 를 활용해 서울의 날씨 데이터 가져오기
1) API 문서 확인하기
1. 입력 파라미터: https://openweathermap.org/current#name
2. 응답 예시: https://openweathermap.org/current#example_JSON
2) .env 파일에 API_KEY
를 저장.
1. 중요한 정보(API KEY, DB 패스워드 등)를 숨기는데 중요한 .env 파일
3) requests
를 사용하여 OpenWeather API에 요청을 보내고 응답을 가져온다.
4) 응답에서 날씨, 온도, 습도 정보 등을 추출.
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 = "http://api.openweathermap.org/data/2.5/weather"
params = {"q": city_name, "appid": api_key, "units": "metric"}
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") # 기준시간
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
import pandas as pd
# 데이터 준비
df = pd.DataFrame(df_selected)
df.to_csv('weather_api.csv', index=False)
print("날씨 정보가 CSV 파일로 저장되었습니다.")
단점
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}"
)
__init__
****: API 클라이언트 객체를 생성할 때 API 키를 초기화합니다. API 키가 없는 경우 예외를 발생시킨다.get_city
****: 도시 이름과 온도 단위를 파라미터로 받아 해당 도시의 최신 날씨 데이터를 Open Weather API를 통해 가져온다. requests 라이브러리를 사용하여 API 요청을 보내고, 응답 상태 코드가 200인 경우 데이터를 반환.*새로 만든 WeatherApiClient 를 활용해 API 를 통해 데이터를 요청하고 CSV 파일에 저장
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)
KEY POINT
INSIGHT(실습)
# OpenWeather API 요청을 위한 기본 설정
# (https://openweathermap.org/api)
# API 키 가져오기
api_key = os.environ.get('API_KEY')
city_name = "Sydney"
# API 요청 URL
url = f"http://api.openweathermap.org/data/2.5/weather?q={city_name}&units=metric&appid={api_key}"
response = requests.get(url)
response
# 상태 코드 확인
print(f"Status Code: {response.status_code}")
if response.status_code == 200:
data = response.json()
print("Weather Data:", data)
else:
print("Error:", response.json())
Status Code: 200
Weather Data: {'coord': {'lon': 151.2073, 'lat': -33.8679}, 'weather': [{'id': 500, 'main': 'Rain', 'description': 'light rain', 'icon': '10d'}], 'base': 'stations', 'main': {'temp': 18.75, 'feels_like': 18.95, 'temp_min': 17.69, 'temp_max': 20.17, 'pressure': 1020, 'humidity': 87, 'sea_level': 1020, 'grnd_level': 1012}, 'visibility': 10000, 'wind': {'speed': 5.14, 'deg': 170}, 'rain': {'1h': 0.32}, 'clouds': {'all': 100}, 'dt': 1731650678, 'sys': {'type': 2, 'id': 2018875, 'country': 'AU', 'sunrise': 1731609820, 'sunset': 1731659764}, 'timezone': 39600, 'id': 2147714, 'name': 'Sydney', 'cod': 200}
# 테이블화
pd.json_normalize(data)
# DataFrame 생성 및 CSV 파일로 저장
df = pd.DataFrame(df_selected)
df.to_csv('weather_api.csv', index=False)
print("날씨 정보가 CSV 파일로 저장되었습니다.")
날씨 정보가 CSV 파일로 저장되었습니다.
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("Sydney")
# 간단한 전처리
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)
+추가로 네이버에서 특정검색어 결과 뽑기
import requests # HTTP 요청을 보내고 응답을 받기 위함
import pandas as pd # 테이블 형식으로 데이터 정리를 위함
def search_naver_blog(query, client_id, client_secret):
base_url = "https://openapi.naver.com/v1/search/blog" # 검색 API 기본 URL 주소
headers = {
"X-Naver-Client-Id": client_id,
"X-Naver-Client-Secret": client_secret
}
params = {
"query": query, # 검색어
"display": 10 # 검색 결과 개수
}
response = requests.get(base_url, headers=headers, params=params)
if response.status_code == 200:
data2 = response.json() # JSON 형식으로 파싱
items = data2['items']
# pd.json_normalize()를 사용하여 JSON 데이터를 DataFrame으로 변환
df2 = pd.json_normalize(items)
# 특정 열 선택 (필요한 경우)
df3 = df2[['title', 'link', 'description', 'bloggername']]
# DataFrame 출력
print(df3.to_markdown(index=False)) # 깔끔한 테이블 출력
# CSV 파일로 저장
csv_filename = "naver_blog_search_results.csv"
df3.to_csv(csv_filename, index=False, encoding='utf-8-sig') # utf-8-sig 인코딩으로 저장하여 한글 문제 방지
print(f"검색 결과가 '{csv_filename}' 파일로 저장되었습니다.")
else:
print(f'Error: {response.status_code}')
# 발급받은 ID, SECRET -> 본인이 발급받은 id, secret 입력하기
client_id = "_ZaMUbBH38sTsY8X7pdN"
client_secret = "C6t7kuo0Kr"
query = input('검색어를 입력하세요: ')
search_naver_blog(query, client_id, client_secret)
import requests
import pandas as pd
class NaverBlogSearchClient:
"""
네이버 블로그 검색 API를 사용하여 검색 결과를 가져오는 클라이언트입니다.
"""
def __init__(self, client_id: str, client_secret: str):
self.base_url = "https://openapi.naver.com/v1/search/blog"
if not client_id or not client_secret:
raise ValueError("Client ID와 Client Secret은 필수 입력값입니다.")
self.client_id = client_id
self.client_secret = client_secret
def search_blog(self, query: str, display: int = 10) -> pd.DataFrame:
"""
지정된 검색어로 네이버 블로그 검색 결과를 가져옵니다.
Parameters:
- query (str): 검색어
- display (int): 가져올 검색 결과의 개수 (최대 100개까지)
Returns:
- pd.DataFrame: 검색 결과를 포함한 DataFrame
"""
headers = {
"X-Naver-Client-Id": self.client_id,
"X-Naver-Client-Secret": self.client_secret
}
params = {
"query": query,
"display": display
}
response = requests.get(self.base_url, headers=headers, params=params)
if response.status_code == 200:
data = response.json()
items = data.get('items', [])
# DataFrame 변환
df = pd.json_normalize(items)
df = df[['title', 'link', 'description', 'bloggername']] # 주요 열만 선택
return df
else:
raise Exception(f"네이버 블로그 검색 API 요청 실패. 상태 코드: {response.status_code}. 응답: {response.text}")
# 사용 예시
if __name__ == "__main__":
client_id = "_ZaMUbBH38sTsY8X7pdN" # 네이버 API 클라이언트 ID
client_secret = "C6t7kuo0Kr" # 네이버 API 클라이언트 시크릿
naver_client = NaverBlogSearchClient(client_id, client_secret)
try:
query = input("검색어를 입력하세요: ")
result_df = naver_client.search_blog(query)
# 검색 결과 출력
print(result_df.to_markdown(index=False))
# CSV로 저장
csv_filename = "naver_blog_search_results.csv"
result_df.to_csv(csv_filename, index=False, encoding='utf-8-sig')
print(f"검색 결과가 '{csv_filename}' 파일로 저장되었습니다.")
except Exception as e:
print(f"오류가 발생했습니다: {e}")