post_pixabay_dummyData.py
import random import requests from datetime import datetime, timedelta # Pixabay API 키 및 URL 설정 PIXABAY_API_KEY = "PIXABAY_API_KEY" BASE_URL = "https://pixabay.com/api/" # 카테고리와 한글 이름 매핑 (ID를 기준으로 매핑) categories = { 1: ("bread", "빵"), 2: ("rice_cake", "떡"), 3: ("side_dish", "반찬"), 4: ("grocery", "마트"), 5: ("etc", "기타") } # 카테고리별 홍보 문구를 생성하는 함수 def generate_random_content(category): """ 주어진 카테고리에 따라 랜덤 홍보 문구(300자 내외)를 생성합니다. :param category: 카테고리 이름 (영문) :return: 랜덤으로 생성된 홍보 문구 (문자열) """ if category == "bread": bread_names = ["바게트", "크루아상", "식빵", "치아바타", "호밀빵"] selected_bread = random.choice(bread_names) return f"{selected_bread}는 부드럽고 고소한 맛이 일품입니다. 신선한 재료로 만들어져 더욱 특별한 {selected_bread}! 아침 식사나 간식으로 완벽한 선택입니다. 이번 기회에 특별 할인가로 만나보세요!" elif category == "rice_cake": rice_cake_names = ["인절미", "송편", "가래떡", "절편", "백설기"] selected_rice_cake = random.choice(rice_cake_names) return f"전통의 맛 {selected_rice_cake}를 만나보세요. 쫄깃하고 담백한 맛이 일품인 {selected_rice_cake}! 특별한 날이나 일상에서 즐기기에 제격입니다. 지금 할인된 가격으로 만나보세요!" elif category == "side_dish": side_dish_names = ["김치", "멸치볶음", "나물무침", "오징어채", "장조림"] selected_side_dish = random.choice(side_dish_names) return f"밥도둑 {selected_side_dish}! 깊고 진한 맛이 밥 한 공기를 순식간에 비우게 만듭니다. 신선한 재료로 만들어진 {selected_side_dish}를 지금 만나보세요!" elif category == "grocery": grocery_names = ["신선한 과일", "유기농 채소", "곡류", "생수", "건강 간식"] selected_grocery = random.choice(grocery_names) return f"건강을 생각한다면 {selected_grocery}! 최고의 품질과 신선함을 보장합니다. {selected_grocery}로 일상의 활력을 더해보세요. 지금 특별한 가격으로 제공됩니다!" elif category == "etc": etc_items = ["다용도 정리함", "휴대용 텀블러", "방향제", "LED 조명", "무선 이어폰"] selected_etc = random.choice(etc_items) return f"생활을 더 편리하게 만들어주는 {selected_etc}! 세련된 디자인과 실용성을 겸비한 {selected_etc}를 지금 할인된 가격으로 만나보세요!" # Pixabay에서 이미지를 가져오는 함수 def fetch_images(query, max_results=10): """ Pixabay API를 호출하여 검색어에 해당하는 이미지를 가져옵니다. :param query: 검색어 :param max_results: 가져올 이미지의 최대 개수 :return: 이미지 URL 리스트 """ params = { "key": PIXABAY_API_KEY, # 개인 API 키 "q": query, # 검색 키워드 "image_type": "photo", # 이미지 유형 (사진) "per_page": max_results # 가져올 최대 이미지 수 } try: response = requests.get(BASE_URL, params=params) response.raise_for_status() # HTTP 오류 발생 시 예외 처리 data = response.json() return [item["webformatURL"] for item in data.get("hits", [])] except requests.exceptions.RequestException as e: print(f"[오류] Pixabay API 호출 실패: {e}") return [] # 더미 데이터를 생성하는 함수 def generate_dummy_posts(): """ 더미 데이터를 생성하고, SQL INSERT 쿼리를 반환합니다. :return: SQL INSERT 쿼리 리스트 """ sql_statements = [] user_ids = range(1, 100) # UserId는 1부터 99까지 today = datetime.now() # 카테고리별 이미지 캐싱 (중복 API 호출 방지) category_images = {} for category_id, (query, _) in categories.items(): images = fetch_images(query) # Pixabay API 호출 # API 호출 실패 시 기본 이미지 사용 category_images[category_id] = images if images else ["https://via.placeholder.com/440"] # 각 사용자별 데이터 생성 for user_id in user_ids: for i in range(5): # 사용자당 5개의 데이터 생성 try: category_id = (i % 5) + 1 category, korean_title = categories[category_id] images = category_images[category_id] # 데이터 생성 content = generate_random_content(category) title = f"{korean_title}_{i} 판매합니다." original_price = random.randint(1000, 50000) discount_rate = random.randint(1, 60) sale_end_date = today + timedelta(days=random.randint(1, 100)) production_date = today image = random.choice(images) created_at = today updated_at = today # 특수문자 이스케이프 처리 (SQL 오류 방지) content = content.replace("'", "''") title = title.replace("'", "''") # SQL 문 생성 sql = ( f"INSERT INTO posts (content, title, original_price, discount_rate, sale_end_date, category, " f"image, createdAt, updatedAt, UserId, production_date) VALUES " f"('{content}', '{title}', {original_price}, {discount_rate}, " f"'{sale_end_date.strftime('%Y-%m-%d %H:%M:%S')}', '{category}', '{image}', " f"'{created_at.strftime('%Y-%m-%d %H:%M:%S')}', '{updated_at.strftime('%Y-%m-%d %H:%M:%S')}', " f"{user_id}, '{production_date.strftime('%Y-%m-%d %H:%M:%S')}');" ) sql_statements.append(sql) except Exception as e: print(f"[오류] 데이터 생성 실패 (UserId: {user_id}, Iteration: {i}): {e}") return sql_statements # 실행 및 파일 저장 try: dummy_posts = generate_dummy_posts() with open("post_dummyData_pixabay.sql", "w", encoding="utf-8") as f: f.write("\n".join(dummy_posts)) print(f"{len(dummy_posts)}개의 INSERT 쿼리를 'post_dummyData_pixabay.sql' 파일에 저장했습니다.") except Exception as e: print(f"[오류] 파일 저장 중 오류 발생: {e}")
Pixabay API 키 및 URL 구성
- Pixabay API 키와 기본 URL에 대해 설명합니다.
fetch_images 함수
- Pixabay API를 호출하고 검색 결과에서 이미지 URL만 추출합니다.
- 성공/실패 조건을 나누어 처리합니다.
generate_dummy_posts 함수
- 사용자 ID와 카테고리를 기준으로 더미 데이터를 생성하며, 카테고리별 이미지는 캐싱하여 중복 API 호출을 방지합니다.
- 랜덤 데이터를 생성해 SQL INSERT 쿼리를 만듭니다.
SQL 저장 및 출력
- 생성된 SQL INSERT 쿼리를 파일에 저장하고 완료 메시지를 출력합니다.
댓글 ( 0)
댓글 남기기