
API 활용하기 - 다른 서비스와 대화하기
웹 스크래핑보다 깔끔하고 공식적인 데이터 수집 방법! API를 통해 다양한 서비스의 데이터를 가져와 봅시다.
API란?
API(Application Programming Interface)는 프로그램끼리 대화하는 약속된 방법입니다.
레스토랑에 비유하면:
- 당신 = 프로그램 (손님)
- 메뉴판 = API 문서
- 웨이터 = API
- 주방 = 서버
메뉴판(API 문서)을 보고, 웨이터(API)에게 주문하면, 주방(서버)에서 요리(데이터)를 가져다 줍니다.
REST API 기본 개념

REST API는 HTTP 메서드를 사용해 데이터를 주고받습니다.
| HTTP 메서드 | 동작 | 예시 |
|---|---|---|
| GET | 데이터 조회 | 사용자 목록 가져오기 |
| POST | 데이터 생성 | 새 게시글 작성 |
| PUT | 데이터 수정 | 프로필 정보 업데이트 |
| DELETE | 데이터 삭제 | 댓글 삭제 |
대부분의 공개 API는 GET 방식으로 데이터를 조회합니다.
JSON - API의 공용어
API가 주고받는 데이터는 대부분 JSON(JavaScript Object Notation) 형식입니다.
# JSON은 파이썬 딕셔너리와 매우 비슷합니다!
{
"name": "홍길동",
"age": 25,
"skills": ["Python", "JavaScript"],
"is_student": true
}
파이썬에서 JSON 다루기
import json
# JSON 문자열 → 파이썬 딕셔너리
json_str = '{"name": "홍길동", "age": 25}'
data = json.loads(json_str)
print(data["name"]) # 홍길동
# 파이썬 딕셔너리 → JSON 문자열
person = {"name": "이영희", "age": 30}
json_str = json.dumps(person, ensure_ascii=False)
print(json_str) # {"name": "이영희", "age": 30}
첫 번째 API 호출
무료 연습용 API인 JSONPlaceholder를 사용해봅시다.
import requests
# 게시글 목록 가져오기
url = "https://jsonplaceholder.typicode.com/posts"
response = requests.get(url)
# JSON으로 변환
posts = response.json() # 자동으로 파이썬 리스트/딕셔너리로 변환
# 처음 3개만 출력
for post in posts[:3]:
print(f"[{post['id']}] {post['title']}")
print()
실행 결과:
[1] sunt aut facere repellat provident occaecati excepturi optio reprehenderit
[2] qui est esse
[3] ea molestias quasi exercitationem repellat qui ipsa sit aut
매개변수 전달하기
URL 파라미터 (Query String)
import requests
# 특정 사용자의 게시글만 가져오기
url = "https://jsonplaceholder.typicode.com/posts"
params = {
"userId": 1, # 사용자 ID = 1
"_limit": 3 # 3개만
}
response = requests.get(url, params=params)
posts = response.json()
for post in posts:
print(f"[{post['id']}] {post['title'][:30]}...")
헤더 설정
import requests
headers = {
"Accept": "application/json",
"User-Agent": "MyPythonApp/1.0"
}
response = requests.get(url, headers=headers)
실전 예제 1: 날씨 API
Open-Meteo라는 무료 날씨 API를 사용해봅시다 (API 키 불필요).
import requests
# 서울의 현재 날씨
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": 37.5665, # 서울 위도
"longitude": 126.9780, # 서울 경도
"current_weather": True
}
response = requests.get(url, params=params)
data = response.json()
weather = data["current_weather"]
print(f"현재 온도: {weather['temperature']}°C")
print(f"풍속: {weather['windspeed']} km/h")
print(f"날씨 코드: {weather['weathercode']}")
실행 결과 예시:
현재 온도: 3.2°C
풍속: 12.5 km/h
날씨 코드: 3
실전 예제 2: 랜덤 사용자 생성 API
import requests
url = "https://randomuser.me/api/"
params = {"results": 3, "nat": "kr"} # 한국 사용자 3명
response = requests.get(url, params=params)
data = response.json()
for user in data["results"]:
name = f"{user['name']['last']}{user['name']['first']}"
email = user["email"]
city = user["location"]["city"]
print(f"이름: {name}")
print(f"이메일: {email}")
print(f"도시: {city}")
print("-" * 30)
에러 처리
API 호출은 네트워크 문제나 서버 오류로 실패할 수 있습니다.
import requests
def safe_api_call(url, params=None):
"""안전한 API 호출 함수"""
try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status() # 4xx, 5xx 에러 시 예외 발생
return response.json()
except requests.exceptions.Timeout:
print("요청 시간 초과!")
except requests.exceptions.HTTPError as e:
print(f"HTTP 에러: {e}")
except requests.exceptions.ConnectionError:
print("연결 실패! 인터넷 연결을 확인하세요.")
except requests.exceptions.JSONDecodeError:
print("JSON 파싱 실패!")
return None
# 사용 예
data = safe_api_call("https://jsonplaceholder.typicode.com/posts/1")
if data:
print(f"제목: {data['title']}")
API 키 사용하기
많은 API는 인증을 위해 API 키를 요구합니다.
import requests
# API 키 설정 (실제 키를 사용하세요)
API_KEY = "your_api_key_here"
# 방법 1: URL 파라미터에 포함
params = {
"q": "Seoul",
"appid": API_KEY
}
response = requests.get(url, params=params)
# 방법 2: 헤더에 포함
headers = {
"Authorization": f"Bearer {API_KEY}"
}
response = requests.get(url, headers=headers)
주의: API 키는 비밀번호와 같습니다. 코드에 직접 쓰지 말고, 환경 변수나 별도 파일로 관리하세요!
import os
# 환경 변수에서 API 키 읽기 (권장)
API_KEY = os.environ.get("MY_API_KEY")
스크래핑 vs API 비교
| 항목 | 웹 스크래핑 | API |
|---|---|---|
| 데이터 형식 | HTML (정리 필요) | JSON (바로 사용 가능) |
| 안정성 | 사이트 변경 시 깨짐 | 버전 관리로 안정적 |
| 속도 | HTML 파싱으로 느림 | 필요한 데이터만 빠르게 |
| 합법성 | 회색 지대 | 공식적으로 허용 |
| 제한 | 차단될 수 있음 | 호출 횟수 제한(Rate Limit) |
결론: API가 있으면 API를 사용하세요! 없을 때만 스크래핑을 고려합니다.
직접 해보기
문제 1: 게시글 상세 조회
JSONPlaceholder API에서 게시글 ID 5번의 제목과 본문을 출력하세요.
URL: https://jsonplaceholder.typicode.com/posts/5
정답 보기
import requests
url = "https://jsonplaceholder.typicode.com/posts/5"
response = requests.get(url)
post = response.json()
print(f"제목: {post['title']}")
print(f"본문: {post['body']}")
문제 2: 댓글 수집
게시글 1번에 달린 모든 댓글의 작성자 이메일과 내용을 출력하세요.
URL: https://jsonplaceholder.typicode.com/posts/1/comments
정답 보기
import requests
url = "https://jsonplaceholder.typicode.com/posts/1/comments"
response = requests.get(url)
comments = response.json()
for i, comment in enumerate(comments, 1):
print(f"#{i} {comment['email']}")
print(f" {comment['body'][:50]}...")
print()
문제 3: 여러 도시 날씨
Open-Meteo API를 사용해 서울, 부산, 제주의 현재 온도를 비교하세요.
정답 보기
import requests
cities = {
"서울": (37.5665, 126.9780),
"부산": (35.1796, 129.0756),
"제주": (33.4996, 126.5312)
}
url = "https://api.open-meteo.com/v1/forecast"
for city, (lat, lon) in cities.items():
params = {
"latitude": lat,
"longitude": lon,
"current_weather": True
}
response = requests.get(url, params=params)
data = response.json()
temp = data["current_weather"]["temperature"]
print(f"{city}: {temp}°C")
오늘의 정리
| 개념 | 설명 |
|---|---|
| API | 프로그램끼리 데이터를 주고받는 약속된 방법 |
| REST API | HTTP 메서드(GET, POST 등)로 통신하는 API 방식 |
| JSON | API가 주고받는 데이터 형식 (딕셔너리와 유사) |
| requests.get() | API에 GET 요청을 보내 데이터 조회 |
| response.json() | 응답을 파이썬 딕셔너리/리스트로 변환 |
| API 키 | 인증을 위한 고유 키 (환경 변수로 관리) |
다음 편 예고
다음 편에서는 알고리즘 기초를 다룹니다. 정렬과 탐색 알고리즘을 직접 구현하며, 코딩 테스트의 기본기를 잡아봅시다!
파이썬 Python 파이썬독학 API REST JSON requests 공공API 파이썬실전 IT교육
'Python' 카테고리의 다른 글
| 실습: 주소록 프로그램 만들기 (0) | 2026.02.23 |
|---|---|
| 알고리즘 기초 - 정렬과 탐색 (0) | 2026.02.23 |
| 웹 스크래핑 - 인터넷에서 데이터 수집하기 (0) | 2026.02.23 |
| 28. 매직 메서드 - 파이썬 객체의 비밀 (0) | 2026.02.23 |
| 27. 클래스와 객체 (2) - 상속과 다형성 (0) | 2026.02.22 |
댓글