Today I Learned (TIL)/Python

[TIL] Python 챌린지 - 2회차

신짜린 2024. 7. 19. 12:17

개인_추가_학습_파이썬_챌린지_2주차_API.html
0.61MB

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 문서 읽기

① 기본 정보 확인  엔드포인트 분석
  1. API 버전
  2. 기본 URL
  3. 인증 방식 (API 키, OAuth 등)
  1. 경로 구조
  2. HTTP 메서드 (GET, POST, PUT, DELETE)
  3. 파라미터 (필수 및 선택적)
응답 구조 이해 에러 처리
  1. 응답 형식 (JSON, XML 등)
  2. 응답 필드 설명
  3. 페이지네이션 (있는 경우)
  1. HTTP 상태 코드
  2. 에러 메시지 구조

 

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 선택