본문 바로가기
[업무 지식]/Crawling

[selenium] 네이버페이 주문 이력 추출하기

by 에디터 윤슬 2025. 1. 2.
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from dotenv import load_dotenv

load_dotenv()

# 인증 정보를 환경변수에서 추출합니다.
CAFE_ID = os.getenv('CAFE_ID')
CAFE_PASSWORD = os.getenv('CAFE_PASSWORD')

# ChromeDriver 경로 설정 (본인의 환경에 맞게 수정)
CHROME_DRIVER_PATH = "chromedriver"  # 예: "C:/chromedriver.exe"

# Chrome 옵션 설정 (헤드리스 모드)
chrome_options = Options()
chrome_options.add_argument("--headless")  # 브라우저 창을 띄우지 않고 실행
chrome_options.add_argument("--disable-gpu")  # GPU 사용 안 함
chrome_options.add_argument("--no-sandbox")  # 리눅스 환경에서 권한 문제 방지
chrome_options.add_argument("--disable-extensions")  # 확장 프로그램 비활성화
chrome_options.add_argument("--disable-popup-blocking")  # 팝업 차단 비활성화

# WebDriver 초기화 (ChromeDriver 사용)
service = Service(CHROME_DRIVER_PATH)
driver = webdriver.Chrome(service=service, options=chrome_options)

def main():
    try:
        # 이지포스 로그인 페이지 열기
        print("Accessing to sign in page...")
        driver.get("https://smart.easypos.net/index.jsp")

        # 로그인 페이지가 제대로 열렸는지 확인
        assert "이지포스" in driver.title

        # ID와 비밀번호 입력
        print("Filling in login form...")
        id_box = driver.find_element(By.ID, "id")  # ID 입력 필드
        pw_box = driver.find_element(By.ID, "pw")  # 비밀번호 입력 필드

        id_box.send_keys(CAFE_ID)
        pw_box.send_keys(CAFE_PASSWORD)

        # 로그인 버튼 클릭
        login_button = driver.find_element(By.ID, "log.login")
        login_button.click()

        # 페이지 로딩 대기 (Explicit Wait)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "my_menu"))
        )

        # 네이버페이 주문 이력 페이지 열기
        print("Accessing order history page...")
        driver.get("https://order.pay.naver.com/home?tabMenu=SHOPPING&frm=s_order")

        # 주문 이력 페이지가 제대로 열렸는지 확인
        assert "네이버페이" in driver.title

        # 주문 이력을 출력
        print_order_history()

    finally:
        # WebDriver 종료
        driver.quit()

def print_order_history():
    """
    주문 이력을 출력합니다.
    """
    print("Fetching order history...")
    time.sleep(2)  # 페이지 로딩 대기 (필요 시 조정)

    # 주문 이력 항목 선택 (CSS Selector 사용)
    items = driver.find_elements(By.CSS_SELECTOR, ".p_info")
    
    for item in items:
        try:
            name_element = item.find_element(By.CSS_SELECTOR, "span")
            date_element = item.find_element(By.CSS_SELECTOR, ".date")
            price_element = item.find_element(By.CSS_SELECTOR, "em")

            name = name_element.text.strip()
            date = date_element.text.strip()
            price = price_element.text.strip()

            print(f"{date} - {name}: {price}원")
        except Exception as e:
            print(f"Error parsing item: {e}")

if __name__ == "__main__":
    main()

 

 

  • 주문 이력 여러 개 추출하기(실습 not yet)
import sys
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

# 인증 정보를 환경변수에서 추출합니다.
NAVER_ID = os.environ['NAVER_ID']
NAVER_PASSWORD = os.environ['NAVER_PASSWORD']

def main():
    """
    메인 처리
    """
    # PhantomJS의 WebDriver 객체를 생성합니다.
    driver = webdriver.PhantomJS()
    
    # 화면 크기를 설정합니다.
    driver.set_window_size(800, 600)
    
    # 로그인하고 이동한 뒤 주문 이력을 가져옵니다.
    sign_in(driver)
    navigate(driver)
    goods = scrape_history(driver)
    # 출력합니다.
    print(goods)

def sign_in(driver):
    """
    로그인합니다
    """
    print('Navigating...', file=sys.stderr)
    print('Waiting for sign in page loaded...', file=sys.stderr)
    time.sleep(2)
    
    # 입력 양식을 입력하고 전송합니다.
    driver.get('https://nid.naver.com/nidlogin.login')
    e = driver.find_element_by_id('id')
    e.clear()
    e.send_keys(NAVER_ID)
    e = driver.find_element_by_id('pw')
    e.clear()
    e.send_keys(NAVER_PASSWORD)
    form = driver.find_element_by_css_selector("input.btn_global[type=submit]")
    form.submit()

def navigate(driver):
    """
    적절한 페이지로 이동한 뒤 
    """
    print('Navigating...', file=sys.stderr)
    driver.get("https://order.pay.naver.com/home?tabMenu=SHOPPING")
    print('Waiting for contents to be loaded...', file=sys.stderr)
    time.sleep(2)
    
    # 페이지를 아래로 스크롤합니다.
    # 사실 현재 예제에서는 필요 없지만 활용 예를 위해 넣어봤습니다.
    # 스크롤을 해서 데이터를 가져오는 페이지의 경우 활용할 수 있습니다.
    driver.execute_script('scroll(0, document.body.scrollHeight)')
    wait = WebDriverWait(driver, 10)
    
    # [더보기] 버튼을 클릭할 수 있는 상태가 될 때까지 대기하고 클릭합니다.
    # 두 번 클릭해서 과거의 정보까지 들고옵니다.
    driver.save_screenshot('note-1.png')
    button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#_moreButton a')))
    button.click()
    button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#_moreButton a')))
    button.click()
    # 2초 대기합니다.
    print('Waiting for contents to be loaded...', file=sys.stderr)
    time.sleep(2)

def scrape_history(driver):
    """
    페이지에서 주문 이력을 추출합니다.
    """
    goods = []
    for info in driver.find_elements_by_css_selector('.p_info'):
        # 요소를 추출합니다.
        link_element = info.find_element_by_css_selector('a')
        title_element = info.find_element_by_css_selector('span')
        date_element = info.find_element_by_css_selector('.date')
        price_element = info.find_element_by_css_selector('em')
        # 텍스트를 추출합니다.
        goods.append({
            'url': link_element.get_attribute('.a'),
            'title': title_element.text,
            'description': date_element.text + " - " + price_element.text + "원"
        })
    return goods
    
if __name__ == '__main__':
    main()