실행 ▶️ 버튼 한번 ☝🏻 으로 요새 가장 HOT 🔥 한 팝업스토어 🏪 방문 블로그 작성하기!

우선 블로그의 주제를 고민 🤔 하던 중

‘팝업스토어’가 10~30대 에게 인기가 있다는 기사 📰 를 다수 발견 할 수 있었습니다! 😁


하지만 최신 정보가 꼭 ✅ 필요로 하는 ‘팝업스토어’를

어떻게 저의 꿈 💭 만 같은 실행 ▶️ 버튼 한번으로

블로그를 작성할 수 있을 까 고민과 걱정이 무수히 무수히 들었습니다… 😭


아! 💡

내가 직접 손 ✋🏻 으로 한다고 하면 어떻게 할까?

그 방법을 쭈욱 나열하고 나열 된 행동을 파이썬과 GPT를 활용해 자동화 해보자!


저라면 우선 🙋🏻

  1. 네이버에서 “팝업스토어”를 검색한다.

  2. “뉴스” 탭을 클릭 해 뉴스페이지로 들어간다.

  3. 100개 정도의 뉴스 제목을 정리해서 그중 가장 많이 나온 팝업스토어를 5개 고른다. (왜냐하면 전 기자들의 감을 믿고 뉴스에 그만큼 많이 회자가 된다는 것은 확률상으로 이슈가 되었거나 될 확률이 큰 팝업스토어이기 때문입니다. 😏)

  4. 5개의 팝업 스토어 중 “사진” 또는 “영상” 촬영이 필요할 수 도 있으니 서울 내의 팝업스토어를 선택한다.

  5. 팝업스토어 방문 전에 인터넷 검색을 통해 사전 조사 하고 초안을 작성한다.

  6. 팝업스토어를 방문하여 필요한 사진을 찍고 초안의 내용을 조금씩 수정해서 블로그 작성을 한다.


이제 저의 든든한 친구 👬 GPTs “그리모어”와 함께 하나씩 자동화를 시켜 나갔습니다.


  1. 네이버에서 “팝업스토어”를 검색한다.

    # Selenium 라이브러리에서 필요한 모듈을 불러옵니다.
    import time
    from selenium import webdriver # 웹 브라우저를 자동으로 조작하기 위한 Webdriver를 불러옵니다.
    from selenium.webdriver.chrome.service import Service # Service 클래스를 임포트합니다.
    from selenium.webdriver.common.keys import Keys # 키보드 키를 사용하기 위한 Keys 클래스를 불러옵니다.
    from selenium.webdriver.common.by import By # 요소를 찾을 때 사용할 방법을 지정하는 By 클래스를 불러옵니다.
    from selenium.webdriver.support.ui import WebDriverWait # 특정 요소가 로드될 때까지 기다리는 기능을 사용하기 위해 불러옵니다.
    from selenium.webdriver.support import expected_conditions as EC # 특정 조건이 만족될 때까지 기다리는 조건들을 제공하는 모듈을 EC로 축약하여 불러옵니다.
    
    # 검색하고자 하는 검색어를 변수에 저장합니다. 이 부분을 원하는 검색어로 변경하세요.
    search_term = '팝업스토어'
    
    # Chrome WebDriver의 경로를 지정합니다. 다운로드한 WebDriver의 실제 경로를 입력허세요.
    chrome_driver_path = "/opt/homebrew/bin/chromedriver"
    
    # Service 객체를 생성하면서 ChromeDriver의 경로를 전달합니다.
    service = Service(executable_path=chrome_driver_path)
    
    # Chrome WebDriver를 사용하여 Chrome 브라우저 인스턴스를 생성합니다.
    # 여기서는 service 키워드 인자를 사용하여 Service 객체를 전달합니다.
    driver = webdriver.Chrome(service=service)
    
    # 네이버 웹사이트로 이동합니다.
    driver.get('<https://www.naver.com>')
    
    # 검색창 요소를 찾습니다. 네이버 페이지의 HTML 구조에 따란 'name' 속성이 'query'인 input 요소를 찾습니다.
    search_box = driver.find_element(By.NAME, 'query')
    
    # 찾은 검색창에 앞서 지정한 검색어를 입력합니다.
    search_box.send_keys(search_term)
    #nx_query
    # 검색을 실행합니다. 여기서는 엔터(Enter) 키를 눌러 검색을 수행합니다.
    search_box.send_keys(Keys.RETURN)
    
    # 검색 결과 페이지가 로드될 때까지 최대 10초간 기다립니다. 'main_pack'이라는 ID를 가진 요소가 로드될 때까지 대기합니다.
    # 검색 결과 페이지의 구조에 따라 이 부분은 변경될 수 있습니다.
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#nx_query')))
    
    # 작업을 마친 후, 브라우저를 닫습니다. 테스트 중이거나 후속 작업이 필요한 경우 이 줄을 주석 처리할 수 있습니다.
    driver.quit()
    
  2. GPT에게 도움 받기 위해 내가 발급 받은 API KEY를 입력해준다.

    # OpenAI API 키 설정
    client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
    
  3. 상위 100개 뉴스의 제목을 크롤링하고 그중에 가장 많이 나온 팝업스토어 이름을 찾는다.

    def get_top_news_titles(search_term, max_titles):
        """_summary_
        네이버 뉴스에서 주어진 검색어에 대한 상위 뉴스 제목을 추출합니다.
        
        Args:
            search_term (_type_): 검색어
            max_titles (_type_): 추출할 최대 뉴스 제목 수
            return: 뉴스 제목 리스트
        """
        # Chrome WebDriver 설정 및 Selenium 서비스 시작
        chrome_driver_path = "/opt/homebrew/bin/chromedriver"
        service = Service(executable_path=chrome_driver_path)
        driver = webdriver.Chrome(service=service)
        
        # 네이버 검색 페이지로 이동
        driver.get(f"<https://search.naver.com/search.naver?query={search_term}>")
        
        # '뉴스' 탭 클릭
        news_tab_selector = "#lnb > div.lnb_group > div > div.lnb_nav_area._nav_area_root > div > div.api_flicking_wrap._conveyer_root > div:nth-child(3) > a"
        driver.find_element(By.CSS_SELECTOR, news_tab_selector).click()
        
        # 뉴스 제목을 저장할 리스트
        news_titles = []
        
        # 무한 스크롤 처리: 상위 100개의 뉴스 제목을 수집할 때까지 페이지 다운
        while len(news_titles) < max_titles:
            # 현재 페이지의 뉴스 제목들을 가져옴
            titles_elements = driver.find_elements(By.CSS_SELECTOR, "a.news_tit")
            for title_element in titles_elements:
                if len(news_titles) >= max_titles:
                    break
                news_titles.append(title_element.text)
            
            # 페이지의 맨 아래로 스크롤
            driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)
            
            # 페이지 로드를 기다림
            time.sleep(1)
            
        driver.quit()
        return news_titles
    
    def find_popular_popup_store(news_titles):
        """
        OpenAI GPT를 사용하여 가장 많이 언급된 팝업스토어 이름을 찾습니다.
    
        Args:
            news_titles (_type_): 뉴스 제목 리스트
        return: 가장 많이 언급 된 팝업스토어 이름
        """
        # 뉴스 제목을 하나의 텍스트로 결합
        combined_titles = "\\n".join(news_titles)
        
        # GPT에게 가장 많이 언급된 팝업스토어 이름을 물어봄
        chat_completion = client.chat.completions.create(
            model="gpt-4",   # GPT-4 모델 사용
            messages=[
                {"role": "system", "content": "You're a market analytics expert."},
                {"role": "user", "content": f"다음은 '팝업스토어'에 관한 뉴스 제목들이야. 가장 많이 언급 된 팝업스토어를 5개 제시해줘.\\n{combined_titles}"}
            ]
        )
        return chat_completion.choices[0].message.content.strip()
    
    # '팝업스토어' 검색어로 네이버 뉴스에서 상위 100개 뉴스 제목 추출
    top_news_titles = get_top_news_titles("팝업스토어", 100)
    
    # OpenAI GPT를 사용하여 가장 많이 언급 된 팝업스토어 이름 찾기
    popular_popup_store = find_popular_popup_store(top_news_titles)
    
  4. 5개의 팝업스토어를 나에게 제시해서 내가 그 중에 하나를 고를 수 있도록 한다. 그리고 선택한 팝업스토어로 GPT가 Bing을 이용해 검색하고 네이버 SEO에 최적화 되도록 작성해준다.

    # 사용자로부터 팝업스토어 선택 받기
    def get_user_choice(popular_stores):
        """
        사용자에게 가장 많이 언급된 팝업스토어 중 하나를 선택하도록 요청하고 그 선택을 반환합니다.
    
        Args:
            popular_stores (list): 가장 많이 언급 된 팝업스토어 리스트
        """
        print("가장 많이 언급된 팝업스토어 5개는 다음과 같습니다.: ")
        for i, store in enumerate(popular_stores, start=1):
            print(f"{i}. {store}")
            
        choice = int(input("방문하고 싶은 팝업스토어 번호를 선택해주세요 (1-5): "))
        selected_store = popular_stores[choice - 1]
        return selected_store
    
    selected_popup_store = get_user_choice(popular_popup_store.split('\\n')[2:7]) # 최상위 5개 팝업스토어 중 하나를 선택
    
    def request_story_about_store(store_name):
        """
        선택된 팝업스토어에 대한 재미있고 트렌디한 방문 이야기를 GPT-4.0을 사용해 작성하도록 요청합니다.
    
        Args:
            store_name (str): 사용자가 선택한 팝업스토어 이름
        Returns:
            str: GPT-4.0이 작성한 방문 이야기
        """
        prompt = f"""
        Bing 검색을 통해 '{store_name}' 팝업스토어에 대한 정보를 찾고,
        해당 팝업스토어를 방문한 재미있고 트렌디한 이야기를 담아 블로그를 마크다운 형식으로 작성해줘.
        다양한 정보를 담고 느낀점을 재미있게 표현한 내용을 작성해야 해.
        블로그는 네이버 SEO에 최적화되어야 하고 최소 2000자 이상으로 작성해줘야 해.
        """
        
        response = client.chat.completions.create(
            model="gpt-4",   # GPT-4 모델 사용
            messages=[
                {"role": "system", "content": "You are an AI trained to write creative and SEO-optimized stories about popup stores."},
                {"role": "user", "content": prompt}
            ]
        )
        return response.choices[0].message.content.strip()
    
  5. 마크다운 형태의 파일로 내 Downloads 폴더에 저장 시키도록 한다.

    story_about_store = request_story_about_store(selected_popup_store)
    
    def save_to_md_file(content, filename):
        """
        주어진 내용을 마크다운 파일로 저장합니다.
    
        Args:
            content (str): 파일에 저장할 내용
            filename (str): 저장할 파일의 이름 (경로 포함)
        """
        # 사용자의 홈 디렉토리 경로를 얻습니다.
        home_dir = os.path.expanduser('~')  # 수정된 부분
        # 완전한 파일 경로를 구성합니다.
        full_path = os.path.join(home_dir, 'Downloads', filename)
        
        with open(full_path, 'w') as file:
            file.write(content)
        
    # 파일 이름에 사용할 수 없는 문자를 대체합니다.
    safe_store_name = selected_popup_store.replace(' ', '_').replace('/', '_')
    # 사용자의 'Downloads' 폴더에 결과물 저장
    save_to_md_file(story_about_store, f"{safe_store_name}_story.md")
    

완성된 코드는 바로 두둥! 🤭

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import os 
from openai import OpenAI

# OpenAI API 키 설정
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))

def get_top_news_titles(search_term, max_titles):
    """_summary_
    네이버 뉴스에서 주어진 검색어에 대한 상위 뉴스 제목을 추출합니다.
    
    Args:
        search_term (_type_): 검색어
        max_titles (_type_): 추출할 최대 뉴스 제목 수
        return: 뉴스 제목 리스트
    """
    # Chrome WebDriver 설정 및 Selenium 서비스 시작
    chrome_driver_path = "/opt/homebrew/bin/chromedriver"
    service = Service(executable_path=chrome_driver_path)
    driver = webdriver.Chrome(service=service)
    
    # 네이버 검색 페이지로 이동
    driver.get(f"<https://search.naver.com/search.naver?query={search_term}>")
    
    # '뉴스' 탭 클릭
    news_tab_selector = "#lnb > div.lnb_group > div > div.lnb_nav_area._nav_area_root > div > div.api_flicking_wrap._conveyer_root > div:nth-child(3) > a"
    driver.find_element(By.CSS_SELECTOR, news_tab_selector).click()
    
    # 뉴스 제목을 저장할 리스트
    news_titles = []
    
    # 무한 스크롤 처리: 상위 100개의 뉴스 제목을 수집할 때까지 페이지 다운
    while len(news_titles) < max_titles:
        # 현재 페이지의 뉴스 제목들을 가져옴
        titles_elements = driver.find_elements(By.CSS_SELECTOR, "a.news_tit")
        for title_element in titles_elements:
            if len(news_titles) >= max_titles:
                break
            news_titles.append(title_element.text)
        
        # 페이지의 맨 아래로 스크롤
        driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)
        
        # 페이지 로드를 기다림
        time.sleep(1)
        
    driver.quit()
    return news_titles

def find_popular_popup_store(news_titles):
    """
    OpenAI GPT를 사용하여 가장 많이 언급된 팝업스토어 이름을 찾습니다.

    Args:
        news_titles (_type_): 뉴스 제목 리스트
    return: 가장 많이 언급 된 팝업스토어 이름
    """
    # 뉴스 제목을 하나의 텍스트로 결합
    combined_titles = "\\n".join(news_titles)
    
    # GPT에게 가장 많이 언급된 팝업스토어 이름을 물어봄
    chat_completion = client.chat.completions.create(
        model="gpt-4",   # GPT-4 모델 사용
        messages=[
            {"role": "system", "content": "You're a market analytics expert."},
            {"role": "user", "content": f"다음은 '팝업스토어'에 관한 뉴스 제목들이야. 가장 많이 언급 된 팝업스토어를 5개 제시해줘.\\n{combined_titles}"}
        ]
    )
    return chat_completion.choices[0].message.content.strip()

# '팝업스토어' 검색어로 네이버 뉴스에서 상위 100개 뉴스 제목 추출
top_news_titles = get_top_news_titles("팝업스토어", 100)

# OpenAI GPT를 사용하여 가장 많이 언급 된 팝업스토어 이름 찾기
popular_popup_store = find_popular_popup_store(top_news_titles)

# print(f"가장 많이 언급 된 팝업스토어: {popular_popup_store}")

# 사용자로부터 팝업스토어 선택 받기
def get_user_choice(popular_stores):
    """
    사용자에게 가장 많이 언급된 팝업스토어 중 하나를 선택하도록 요청하고 그 선택을 반환합니다.

    Args:
        popular_stores (list): 가장 많이 언급 된 팝업스토어 리스트
    """
    print("가장 많이 언급된 팝업스토어 5개는 다음과 같습니다.: ")
    for i, store in enumerate(popular_stores, start=1):
        print(f"{i}. {store}")
        
    choice = int(input("방문하고 싶은 팝업스토어 번호를 선택해주세요 (1-5): "))
    selected_store = popular_stores[choice - 1]
    return selected_store

selected_popup_store = get_user_choice(popular_popup_store.split('\\n')[2:7]) # 최상위 5개 팝업스토어 중 하나를 선택

def request_story_about_store(store_name):
    """
    선택된 팝업스토어에 대한 재미있고 트렌디한 방문 이야기를 GPT-4.0을 사용해 작성하도록 요청합니다.

    Args:
        store_name (str): 사용자가 선택한 팝업스토어 이름
    Returns:
        str: GPT-4.0이 작성한 방문 이야기
    """
    prompt = f"""
    Bing 검색을 통해 '{store_name}' 팝업스토어에 대한 정보를 찾고,
    해당 팝업스토어를 방문한 재미있고 트렌디한 이야기를 담아 블로그를 마크다운 형식으로 작성해줘.
    다양한 정보를 담고 느낀점을 재미있게 표현한 내용을 작성해야 해.
    블로그는 네이버 SEO에 최적화되어야 하고 최소 2000자 이상으로 작성해줘야 해.
    """
    
    response = client.chat.completions.create(
        model="gpt-4",   # GPT-4 모델 사용
        messages=[
            {"role": "system", "content": "You are an AI trained to write creative and SEO-optimized stories about popup stores."},
            {"role": "user", "content": prompt}
        ]
    )
    return response.choices[0].message.content.strip()

story_about_store = request_story_about_store(selected_popup_store)

def save_to_md_file(content, filename):
    """
    주어진 내용을 마크다운 파일로 저장합니다.

    Args:
        content (str): 파일에 저장할 내용
        filename (str): 저장할 파일의 이름 (경로 포함)
    """
    # 사용자의 홈 디렉토리 경로를 얻습니다.
    home_dir = os.path.expanduser('~')  # 수정된 부분
    # 완전한 파일 경로를 구성합니다.
    full_path = os.path.join(home_dir, 'Downloads', filename)
    
    with open(full_path, 'w') as file:
        file.write(content)
    
# 파일 이름에 사용할 수 없는 문자를 대체합니다.
safe_store_name = selected_popup_store.replace(' ', '_').replace('/', '_')
# 사용자의 'Downloads' 폴더에 결과물 저장
save_to_md_file(story_about_store, f"{safe_store_name}_story.md")


실행 ▶️ 결과는,

  • 100개의 기사 제목을 분석 한 후 가장 빈도가 높은 5개의 팝업스토어를 잘 제안해줬구요~

    /image

  • 그리고 저에게 선택권을 줬습니다.

  • 제가 지정한 폴더에 저장까지 아주 완벽히 처리해주었습니다.


그럼 한번 글의 수준을 볼까요? 😆


서울에 위치한 더현대 서울 팝업스토어는 평소에 게임을 사랑하는 저에게는 놀이터와 같았습니다. 팝업스토어라는 이름답게 일시적으로, 그러나 강력하게 존재감을 드러내는 넷마블의 이 팝업스토어는 고유의 배경을 지닌 흥미로운 이야기들로 가득 찼습니다.

느낀점

우선 들어서자마자 저를 반겨준 것은 바로 넷마블 게임 속 아이템들이 새로운 형태로 재해석되어 대형 입체 모형으로 전시된 모습이었습니다. 감탄하며 걸어가다 보니, 머무르고 싶은 장소가 너무나도 많았습니다.

image_link

그 중에서도 넷마블 게임의 히트작 '몬스터길들이기'를 테마로 한 공간은 특히 독특했습니다. 게임에서 벗어나 현실로 온 듯한 귀여운 몬스터들은 방문객들로 하여금 게임 안으로 들어온 것처럼 느끼는 시간을 선사했습니다.

image_link

잠시 지쳐서 쉬고 싶을 때는 게임을 즐길 수 있는 편안한 휴식공간이 마련되어 있습니다. 여기에서 다양한 넷마블 게임을 직접 체험해볼 수 있었는데요, 보통 장소와는 다르게 직접 느낄 수 있는 체험은 정말 재미있는 시간이었습니다.

이런 분들에게 추천드려요

팝업스토어는 일시적인 존재지만 잠시 동안의 독특하고 특별한 경험을 선사합니다. 게임을 좋아하시거나, 혹은 팝업스토어와 같은 독특한 공간에서 색다른 이야기를 작성하시고 싶으신 분들께 넷마블의 '더현대 서울 팝업스토어'를 무척 추천드리고 싶습니다. 이 곳을 방문하신다면 분명 독특한 체험과 함께 잊지 못할 추억을 만들어가실 수 있으실 거예요.

저는 오늘도 다채로운 이야기와 트렌디한 소식을 전하며 블로그를 마무리하겠습니다. 다음 포스팅에서 만나요!

끝.


아직은 처음 👶🏻 이라 완벽한 글이 나오진 않았지만 블로그 작성의 초안으로는 충분한 거 같습니다. 이제 필요한 거는 ‘화룡정점’ 말 그대로 제가 팝업스토어에 가서 사진을 찍고 조금 더 풍성한 내용으로 꾸미는 거겠죠? ^^

부족한 자료 읽어주셔서 진심으로 감사합니다. 🙏

8
5개의 답글

(채용) 콘텐츠 마케터, AI 엔지니어, 백엔드 개발자

지피터스의 수 천개 AI 활용 사례 데이터를 AI로 재가공 할 인재를 찾습니다

👉 이 게시글도 읽어보세요