Data Engineering/python

EP18 | 고급 Python 활용 #7 | API 데이터 활용 (REST API, JSON 처리)

ygtoken 2025. 3. 19. 23:03
728x90

이 글에서 다루는 개념

Python에서는 REST API를 사용하여 웹 데이터를 가져오거나 서버와 통신할 수 있습니다.
이번 글에서는 다음 내용을 학습합니다.

  • REST API 개념 및 활용
  • Python requests 모듈을 사용한 API 호출
  • JSON 데이터 처리 (json 모듈 활용)
  • 공공 데이터 API 요청 및 응답 처리

1️⃣ REST API란?

📌 **REST API(Representational State Transfer API)**란?

  • HTTP 프로토콜을 사용하여 클라이언트와 서버가 데이터를 주고받는 방식
  • 대부분의 웹 서비스(API)는 JSON(JavaScript Object Notation) 형식으로 데이터를 주고받음
  • GET, POST, PUT, DELETE 등의 HTTP 메서드를 사용하여 데이터를 처리

📌 API 요청 방식 예제

 

메서드  설명
GET 데이터를 조회
POST 데이터를 생성
PUT 데이터를 수정
DELETE 데이터를 삭제

2️⃣ requests 모듈을 사용한 API 호출

📌 설치 (requests가 없을 경우)

pip install requests

🔹 GET 요청 (데이터 조회)

import requests

url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)  # GET 요청

# 응답 데이터 출력
print(response.status_code)  # 응답 코드 (200: 성공)
print(response.json())  # JSON 데이터 출력

 

📌 출력 예시

{
  "userId": 1,
  "id": 1,
  "title": "API 데이터 활용 예제",
  "body": "REST API를 호출하여 데이터를 가져오는 예제입니다."
}

🔹 POST 요청 (데이터 생성)

url = "https://jsonplaceholder.typicode.com/posts"
data = {"title": "Python API", "body": "API 요청 예제", "userId": 1}

response = requests.post(url, json=data)
print(response.json())  # 서버 응답 출력

📌 POST 요청은 새로운 데이터를 생성할 때 사용됨

  • json=data → 데이터를 JSON 형식으로 전송

🔹 PUT 요청 (데이터 수정)

url = "https://jsonplaceholder.typicode.com/posts/1"
update_data = {"title": "Updated Title", "body": "Updated content"}

response = requests.put(url, json=update_data)
print(response.json())
  • 기존 데이터를 수정할 때 사용

🔹 DELETE 요청 (데이터 삭제)

url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.delete(url)
print(response.status_code)  # 200이면 성공

3️⃣ JSON 데이터 처리 (json 모듈 활용)

📌 JSON(JavaScript Object Notation)란?

  • 데이터를 키-값 형식의 구조화된 문자열로 저장하는 포맷
  • Python의 딕셔너리와 유사한 구조

📌 JSON 데이터 변환 (json.loads(), json.dumps())

import json

# JSON 문자열 → Python 딕셔너리 변환
json_data = '{"name": "Alice", "age": 25, "city": "Seoul"}'
data = json.loads(json_data)

print(data["name"])  # Alice

# Python 딕셔너리 → JSON 문자열 변환
json_string = json.dumps(data, indent=4)
print(json_string)

 

📌 출력 결과

{
    "name": "Alice",
    "age": 25,
    "city": "Seoul"
}

4️⃣ 공공 데이터 API 활용 예제

📌 공공 데이터 포털에서 API 키 발급 후 활용 가능
예제: https://api.publicapis.org/entries (무료 API 목록 조회)

import requests

url = "https://api.publicapis.org/entries"
response = requests.get(url)

if response.status_code == 200:
    data = response.json()
    for entry in data["entries"][:5]:  # 상위 5개 API 출력
        print(f"API: {entry['API']} | 설명: {entry['Description']}")
else:
    print("API 요청 실패")

 

📌 출력 예시

API: Cat Facts | 설명: 무작위 고양이 정보 제공 API
API: OpenWeather | 설명: 날씨 정보 API
API: NASA | 설명: NASA 오픈 데이터 API
...

📌 실전 문제: API 데이터 활용 연습하기


문제 1: requests를 사용하여 JSON 데이터 가져오기

📌 https://jsonplaceholder.typicode.com/users/1 API에서 데이터를 가져와 출력하세요.

import requests
# 🔽 여기에 코드 작성
import requests

url = "https://jsonplaceholder.typicode.com/users/1"
response = requests.get(url)

if response.status_code == 200:
    print(response.json())
else:
    print("API 요청 실패")

문제 2: POST 요청을 사용하여 새로운 데이터 생성하기

📌 새로운 게시글을 추가하는 POST 요청을 보내고 응답을 출력하세요.

import requests
# 🔽 여기에 코드 작성
import requests

url = "https://jsonplaceholder.typicode.com/posts"
data = {"title": "New Post", "body": "This is a test post.", "userId": 1}

response = requests.post(url, json=data)
print(response.json())

문제 3: JSON 데이터를 Python 딕셔너리로 변환하기

📌 다음 JSON 문자열을 파이썬 딕셔너리로 변환하고, age 값을 출력하세요.

import json

json_data = '{"name": "John", "age": 30, "city": "New York"}'
# 🔽 여기에 코드 작성
import json

json_data = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_data)

print(data["age"])  # 30

문제 4: 공공 데이터 API를 사용하여 3개의 무료 API 목록 출력하기

📌 https://api.publicapis.org/entries API에서 상위 3개의 무료 API 이름과 설명을 출력하세요.

import requests
# 🔽 여기에 코드 작성
import requests

url = "https://api.publicapis.org/entries"
response = requests.get(url)

if response.status_code == 200:
    data = response.json()
    for entry in data["entries"][:3]:  # 상위 3개 API 출력
        print(f"API: {entry['API']} | 설명: {entry['Description']}")
else:
    print("API 요청 실패")

 

728x90