파이썬

 

 

 

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 쿼리를 파일에 저장하고 완료 메시지를 출력합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

일색 소박은 있어도 박색 소박은 없다 , 아름다운 여자는 남편에게 박대를 받게되나 못생긴 여자는 그렇지 않으니, 아무리 아름다운 여자라도 그 사람됨이 좋지 않으면 남편에게 버림받게 됨을 이르는 말. / 사람됨이 얼굴에 매인 것은 아니라는 말.

댓글 ( 0)

댓글 남기기

작성