tmdb_to_sql.py
import requests
import random
import re
# TMDB API 키 및 설정
API_KEY = "TMDB API 키"
BASE_URL = "https://api.themoviedb.org/3"
GENRE_MAP = {
28: "액션", 16: "애니메이션", 10749: "로맨스", 99: "다큐멘터리",
18: "드라마", 35: "코미디", 27: "공포", 10402: "음악",
10770: "Reality TV", 878: "SF", 10751: "가족", 80: "범죄",
10752: "전쟁", 53: "스릴러", 14: "판타지", 36: "역사",
37: "서부", 12: "어드벤처", 9648: "미스터리"
}
LANGUAGE = "ko-KR"
OUTPUT_FILE = "optimized_tmdb_data.sql"
# 한글 확인 함수
def is_korean(text):
return bool(re.search("[가-힣]", text))
# API 요청 공통 함수
def fetch_from_api(endpoint, params):
url = f"{BASE_URL}/{endpoint}"
response = requests.get(url, params=params)
if response.status_code != 200:
print(f"Error fetching {endpoint}: {response.status_code}")
return {}
return response.json()
# 특수문자 처리 함수
def escape_single_quotes(text):
return text.replace("'", "''")
# 데이터 추출 공통 함수 (출연진, 감독, 트레일러, 런타임)
def extract_movie_data(item_id, data_type):
# 출연진 및 감독 정보 추출
#1.출연진정보가져오기
#https://api.themoviedb.org/3/movie/1100099/credits?api_key=키값&language=ko-KR&&page=1
credits = fetch_from_api(f"{data_type}/{item_id}/credits", {"api_key": API_KEY, "language": LANGUAGE})
cast = credits.get("cast", [])
crew = credits.get("crew", [])
top_actors = ", ".join([escape_single_quotes(actor["name"]) for actor in cast[:5]]) # 따옴표 처리
director = next((escape_single_quotes(member["name"]) for member in crew if member["job"] == "Director"), "감독 정보 없음")
# 트레일러 URL 추출
#3.예고편 가져오기
#https://api.themoviedb.org/3/movie/1100099/videos?api_key=키값&language=ko-KR
videos = fetch_from_api(f"{data_type}/{item_id}/videos", {"api_key": API_KEY, "language": LANGUAGE})
youtube_trailer = next(
(f"{video['key']}" for video in videos.get("results", [])
if video["site"] == "YouTube" and video["type"] == "Trailer"),
"MKrNC5GINjI"
)
# 런타임 추출
#1.영화 상세보기 https://api.themoviedb.org/3/movie/1100099?api_key=키값&language=ko-KR
details = fetch_from_api(f"{data_type}/{item_id}", {"api_key": API_KEY, "language": LANGUAGE})
running_time = details.get("runtime", 0)
return top_actors, director, youtube_trailer, running_time
# SQL 생성 함수
def generate_sql(data, category, data_type):
sql_list = []
for item in data:
if not is_korean(item.get("title" if data_type == "movie" else "name", "")):
continue
# 공통 데이터 처리
item_id = item.get("id")
title = escape_single_quotes(item.get("title" if data_type == "movie" else "name", ""))
genres = ", ".join([GENRE_MAP.get(genre_id, "") for genre_id in item.get("genre_ids", [])])
date_key = "release_date" if data_type == "movie" else "first_air_date"
release_date = item.get(date_key, "")
year, month = release_date.split("-")[:2] if release_date else ("", "")
content = escape_single_quotes(item.get("overview", "").replace("'", "''"))
poster = f"https://image.tmdb.org/t/p/original{item.get('poster_path', '')}"
price = random.choice([10000, 12000, 15000, 20000])
# 추가 데이터 추출
top_actors, director, youtube_trailer, running_time = extract_movie_data(item_id, data_type)
# SQL 생성
sql = f"""
INSERT INTO tbl_movie (id, category, genre, actor, trailer, price, director, title, content, filename1, opening_year, opening_month, running_time, comment_count, read_count)
VALUES ('admin', '{category}', '{genres}', '{top_actors}', '{youtube_trailer}', {price}, '{director}', '{title}', '{content}', '{poster}', '{year}', '{month}', {running_time}, 0, 0);
"""
sql_list.append(sql)
return sql_list
# 데이터 처리 및 SQL 파일 생성
def process_data():
categories = {
"tv": ["on_the_air"],
"movie": ["top_rated", "now_playing", "upcoming", "popular"]
}
with open(OUTPUT_FILE, "w", encoding="utf-8") as file:
file.write("-- TMDB Movie and TV Data SQL Dump\n\n")
for data_type, category_list in categories.items():
for category in category_list:
print(f"Processing {data_type} data: {category}...")
for page in range(5, 0, -1): # 최신 데이터를 우선
params = {"api_key": API_KEY, "language": LANGUAGE, "page": page}
data = fetch_from_api(f"{data_type}/{category}", params).get("results", [])
sql_list = generate_sql(data, category, data_type)
file.writelines(sql_list)
print(f"Page {page} processed for {category}.")
print(f"SQL 파일 생성 완료: {OUTPUT_FILE}")
# 실행
if __name__ == "__main__":
process_data()
주요 추가 설명
- category_data_count 딕셔너리: 각 카테고리별로 처리된 데이터 개수를 기록.
- print 출력 개선: 데이터를 처리하면서 현재 상태를 실시간으로 확인 가능하며, 마지막에는 총괄 요약을 출력.
실행 후 결과
처리 완료 후 출력되는 메시지 예시:
=== 데이터 처리 결과 === popular: 87개 데이터 처리됨 now_playing: 62개 데이터 처리됨 upcoming: 55개 데이터 처리됨 top_rated: 90개 데이터 처리됨 on_the_air: 40개 데이터 처리됨 Data processing complete. SQL file generated.














댓글 ( 0)
댓글 남기기