1. API란?
API (Application Programming Interface)란 애플리케이션 간 통신을 위한 규약을 말한다.
웹 API란 HTTP 프로토콜을 통해 데이터를 주고받는 인터페이스를 말한다.
2. HTTP 호출과 API 호출의 차이
구분 | 목적 | 응답 형식 |
HTTP 호출 | 일반적인 웹 페이지나 리소스 요청 | 주로 HTML, CSS, JavaScript등의 웹 문서를 반환 |
API 호출 | 특정 기능이나 데이터에 접 | JSON이나 XML 같은 구조화된 데이터 형식으로 응답 |
3. JSON(JavaScript Object Notation)이란?
데이터를 저장하고 전송하기 위한 경량의 데이터 교환 형식이다. 사람이 읽고 쓰기 쉬우며 기계가 파싱하고 만들어내기 쉽다. 또한, 언어 독립적이어서 대부분의 프로그래밍 언어에서 사용할 수 있다.
API 응답으로 JSON을 사용하면, 클라이언트가 쉽게 데이터를 파싱하고 처리할 수 있으며 프로그래밍 언어에 관계없이 일관된 형식으로 데이터를 주고받을 수 있다.
# 구조 예시
# 키-쌍 값의 집합
# 순서가 있는 값의 목록
{
"name": "John Doe",
"age": 30,
"city": "New York",
"hobbies": ["reading", "swimming", "coding"]
}
4. API 문서 읽기
① 기본 정보 확인 | ② 엔드포인트 분석 |
|
|
③ 응답 구조 이해 | ④ 에러 처리 |
|
|
5. 간단한 API 실습
# 문서 URL: https://dog.ceo/dog-api/
import requests
# 랜덤 개 이미지 URL 가져오기
url = "https://dog.ceo/api/breeds/image/random"
response = requests.get(url)
data = response.json()
print(f"랜덤 개 이미지 URL: {data['message']}")
6. 실전 프로젝트: 뉴스 API 데이터 수집기
구분 | 쿼리 스트링 방식 | 파라미터 방식 |
가독성 | 파라미터가 많아질수록 URL이 길어지고 복잡함 | 딕셔너리 형태로 깔끔하게 정리되어 가독성이 좋음 |
유지보수 | 파라미터를 추가하거나 수정할 때 URL 문자열을 직접 수정해야 함 | 딕셔너리에 키-값 쌍을 추가하거나 수정하면 되므로 유지보수가 쉬움 |
URL 인코딩 | 특수 문자가 포함된 값을 수동으로 인코딩해야 할 수 있음 | requests 라이브러리가 자동으로 URL 인코딩을 처리함 |
보안 | API 키와 같은 민감한 정보가 URL에 직접 노출될 수 있음 | 코드 상에서 이러한 정보를 더 명확하게 구분하고 관리할 수 있음 |
동적 파라미터 처리 | 조건에 따라 파라미터를 쉽게 추가하거나 제거할 수 있음 |
# 문서 URL: https://newsapi.org/docs
# 쿼리 스트링 방식
import requests
import csv
def fetch_news_api():
api_key = "YOUR_API_KEY" # NewsAPI의 키를 여기에 입력하세요
url = f"https://newsapi.org/v2/top-headlines?country=kr&apiKey={api_key}"
response = requests.get(url)
news_data = response.json()
articles = []
for article in news_data['articles']:
articles.append({
'title': article['title'],
'description': article['description'],
'url': article['url'],
'publishedAt': article['publishedAt']
})
return articles
def save_to_csv(articles, filename='api_news.csv'):
with open(filename, 'w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=['title', 'description', 'url', 'publishedAt'])
writer.writeheader()
writer.writerows(articles)
articles = fetch_news_api()
save_to_csv(articles)
print("API news data saved to api_news.csv")
# 문서 URL: https://newsapi.org/docs
import requests
import csv
def fetch_news_api():
api_key = "YOUR_API_KEY" # NewsAPI의 키를 여기에 입력하세요
url = "https://newsapi.org/v2/top-headlines"
params = {
"country": "kr",
"apiKey": api_key
}
response = requests.get(url, params=params)
news_data = response.json()
articles = []
for article in news_data['articles']:
articles.append({
'title': article['title'],
'description': article['description'],
'url': article['url'],
'publishedAt': article['publishedAt']
})
return articles
def save_to_csv(articles, filename='api_news.csv'):
with open(filename, 'w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=['title', 'description', 'url', 'publishedAt'])
writer.writeheader()
writer.writerows(articles)
articles = fetch_news_api()
save_to_csv(articles)
print("API news data saved to api_news.csv")
7. 최근 DB: DuckDB
- DuckDB의 특징
1) 분석 중심: DuckDB는 OLAP(Online Analytical Processing) 워크로드에 최적화되어 있다.
2) 열 지향 저장: 데이터를 열 단위로 저장하여 분석 쿼리 성능이 우수하다.
3) 벡터화된 쿼리 실행: 대량의 데이터를 빠르게 처리할 수 있다.
4) SQLite와 유사한 사용법: 임베디드 데이터베이스로, 설정이 거의 필요 없다.
5) Pandas와의 통합: Python의 Pandas 라이브러리와 쉽게 통합된다.
- DuckDB 사용 장점
1) 분석 쿼리 성능이 우수하여 대량의 데이터를 빠르게 처리할 수 있다.
2) Pandas와의 통합이 쉬워, 데이터 분석 작업을 더 효율적으로 수행할 수 있다.
3) SQLite와 마찬가지로 설정이 간단하고 파일 기반으로 동작한다.
# DuckDB 실행 예제
! pip install duckdb
import requests
import duckdb
def fetch_news_api():
api_key = "YOUR_API_KEY" # NewsAPI의 키를 여기에 입력하세요
url = f"https://newsapi.org/v2/top-headlines?country=kr&apiKey={api_key}"
response = requests.get(url)
news_data = response.json()
articles = []
for article in news_data['articles']:
articles.append({
'title': article['title'],
'description': article['description'],
'url': article['url'],
'publishedAt': article['publishedAt']
})
return articles
def save_to_duckdb(articles, db_name='news_api.duckdb'):
# DuckDB 연결 생성
conn = duckdb.connect(db_name)
# 테이블 생성 (이미 존재하지 않는 경우)
conn.execute('''
CREATE TABLE IF NOT EXISTS articles (
title VARCHAR,
description VARCHAR,
url VARCHAR,
publishedAt VARCHAR
)
''')
# 데이터 삽입
conn.executemany('''
INSERT INTO articles (title, description, url, publishedAt)
VALUES (?, ?, ?, ?)
''', [(a['title'], a['description'], a['url'], a['publishedAt']) for a in articles])
conn.close()
articles = fetch_news_api()
save_to_duckdb(articles)
print("API news data saved to news_api.duckdb")
# 저장된 데이터 확인
def print_articles_from_duckdb(db_name='news_api.duckdb'):
conn = duckdb.connect(db_name)
result = conn.execute("SELECT * FROM articles").fetchall()
for row in result:
print(row)
conn.close()
print_articles_from_duckdb()
8. DB 선택
'Today I Learned (TIL) > Python' 카테고리의 다른 글
[TIL] Python 베이직 - 3회차 (0) | 2024.07.23 |
---|---|
[TIL] 데이터 시각화 - Matplotlib (4) | 2024.07.22 |
[TIL] Python 챌린지 - 1회차 (0) | 2024.07.17 |
[TIL] 데이터 전처리 - Pandas(3) (0) | 2024.07.17 |
[TIL] 데이터 전처리 - Pandas(2) (0) | 2024.07.17 |