본문 바로가기

자동화/Selenium

중고 할인 기프티콘 인기 목록 자동화로 확인하기 (기프티스타)

728x90

자주 이용하는 브랜드 메뉴가 있는 경우 정가보다 싸게 구매할 수 있는 중고 판매 기프티콘 앱을 사용합니다. (기프티스타)

 

최대 10% 이상 할인된 금액으로 구매할 수 있어 종종 항목들을 체크하는 경우가 있는데 이부분을 자동화로 구현해보면 재밌을 거 같아서 구현해보았습니다.

 

자주 사용하는 카테고리인 커피, 치킨/피자, 패스트푸드 항목을 선택하여 베스트상품 10개 목록을 추출하는 코드를 작성하였습니다.

 

우선 웹으로 계속 이용하기 위해 배너를 닫는 코드를 구현한 후 해당 카테고리로 이동할 수 있게 find_elements > class_name 코드를 이용하였습니다.

 

카테고리 항목 이동 제외하고는 모든 코드가 동일하기 때문에 함수를 사용하여 구현하였습니다. (카테고리 번호만 입력값으로 구분)

 

def giftList(listnum):
    driver.get('https://app.giftistar.net/home-best')
    time.sleep(5)

    # 웹으로 이용하기 위해 버튼 클릭
    driver.find_element(By.CLASS_NAME, 'bottom-text').click()
    time.sleep(3)

    # 원하는 카테고리 항목으로 이동
    driver.find_elements(By.CLASS_NAME, 'category-wrapper')[listnum].click()
    time.sleep(3)

 

10개 목록을 확인하기 위해 해당 메뉴들을 확인할 수 있게 스크롤 코드가 필요하였습니다.

 

모바일 웹 환경 기반이어서 그런지 다른 스크롤 코드로는 동작하지 않아 여러가지 방법을 사용하다가 move_to_element 코드로 스크롤을 내릴 수 있어서 해당 코드를 사용하여 구현하였습니다.

 

해당 스크롤한 위치 데이터만 추출할 수 있는걸로 확인되어 중간 중간 스크롤한 후 데이터를 콘솔로 보여주는 방식을 사용하였습니다.

(해당 내용은 엑셀 저장까지는 필요하지 않은듯 하여 구현을 제외하였습니다.)

 

action = ActionChains(driver)
action.move_to_element(brand_list[3]).perform()

for i in range(0, 3):
    sale_price = price_list[i].text.split(' ')
    print(i + 1, brand_list[i].text, name_list[i].text, origin_list[i].text, sale_price[3], percent_list[i].text)

 

전체 코드입니다. 해당 코드 실행시 각 카테고리별 인기 기프티콘 10개 항목 결과를 콘솔에서 확인할 수 있습니다.

모웹 기반도 일부 제한이 있는듯 하지만 자동화로 구현이 되는점을 확인할 수 있는 좋은 경험이었습니다.

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time
from selenium.webdriver import ActionChains

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))


def giftList(listnum):
    driver.get('https://app.giftistar.net/home-best')
    time.sleep(5)

    # 웹으로 이용하기 위해 버튼 클릭
    driver.find_element(By.CLASS_NAME, 'bottom-text').click()
    time.sleep(3)

    # 원하는 카테고리 항목으로 이동
    driver.find_elements(By.CLASS_NAME, 'category-wrapper')[listnum].click()
    time.sleep(3)

    # 필요한 항목들 추출
    brand_list = driver.find_elements(By.CLASS_NAME, 'brand')
    name_list = driver.find_elements(By.CLASS_NAME, 'menu-name')
    origin_list = driver.find_elements(By.CLASS_NAME, 'origin-price')
    price_list = driver.find_elements(By.CLASS_NAME, 'price')
    percent_list = driver.find_elements(By.CLASS_NAME, 'percent')
    time.sleep(2)

    action = ActionChains(driver)
    action.move_to_element(brand_list[3]).perform()

    for i in range(0, 3):
        sale_price = price_list[i].text.split(' ')
        print(i + 1, brand_list[i].text, name_list[i].text, origin_list[i].text, sale_price[3], percent_list[i].text)

    action.move_to_element(brand_list[6]).perform()

    for i in range(3, 6):
        sale_price = price_list[i].text.split(' ')
        print(i + 1, brand_list[i].text, name_list[i].text, origin_list[i].text, sale_price[3], percent_list[i].text)

    action.move_to_element(brand_list[8]).perform()

    for i in range(6, 8):
        sale_price = price_list[i].text.split(' ')
        print(i + 1, brand_list[i].text, name_list[i].text, origin_list[i].text, sale_price[3], percent_list[i].text)

    action.move_to_element(price_list[9]).perform()

    for i in range(8, 10):
        sale_price = price_list[i].text.split(' ')
        print(i + 1, brand_list[i].text, name_list[i].text, origin_list[i].text, sale_price[3], percent_list[i].text)


print('------------ 커피/음료 -----------')
giftList(1)
print('------------ 치킨/피자 -----------')
giftList(5)
print('------------ 패스트푸드 -----------')
giftList(14)

driver.close()

 

코드 실행 결과

 

 

728x90