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}")
