본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] YES24 전용 도서 구매 자동화 프로그램 -Selenium 응용

반응형

  도서 정보를 여러 사람에게 취합해서 자동으로 카트(장바구니)에 넣어주는 자동화 프로그램을 제작하였다. 해당 프로그램은 도서를 여러 사람들에게 취합하여 한번에 구매가 필요한 곳에 유용할 것 같다.(독서모임, 회사 도서 단체 구매 등)

 

  원래는 책마다 하나하나 검색해서 링크를 타고 들어가 카트에 넣는 수동 방식으로 진행했는데 너무 번거롭기도 하여 파이썬을 통해 자동화 프로그램을 제작해보았다.

 

  이번 포스팅에서는 어떤 컨셉으로 프로그램을 제작했는지 간단히 정리하려고 한다.

 

 

 

 

1. 프로그램 순서도(도식화)

 

2. GUI 구성 : PyQt5 사용

 

 -. 정해진 도서 구매 정보 취합 엑셀 템플릿이 있고 해당 파일을 입력.

 -. yes24 ID와 PW를 입력하고 Action을 누르면 엑셀 파일에 있는 링크 정보에 따라 자동으로 카트(장바구니)에 담음.

 -. 각 링크 페이지의 정보를 크롤링을 통해 읽어오며 텍스트 창에 크롤링한 정보 및 진행 상황을 실시간으로 출력해 줌.

 

< 프로그램 GUI 구성 >

 

3. 사용 라이브러리 및 모듈 정보

  

 

1) openpyxl 을 통한 엑셀 정보 읽기 

 

   -. 아래와 같은 엑셀 양식에서 필요한 정보 읽어오는 역할(구매링크를 리스트로 받아옴)

< 입력 엑셀 파일 >

   

 

 

 2) Selenium 라이브러리 활용(크롬 웹드라이버)

 

 

  -. 리스트로 받은 링크를 for문으로 반복하여 각 링크의 도서 정보를 읽어오고 카트에 넣는다.(아래 코드는 일부 발췌)

 

  -. Selenium 통해 각 링크의 도서 정보(판매가, 제목, 판매상태) 등을 크롤링해서 읽어온다.

    주로 크롬 드라이버의 xpath 정보를 활용하여 크롤링

 

 

-. 예외 처리 진행

      ①  yes24 특성상 구매 이벤트가 있을 경우 xpath가 달라지는 경우가 있어 예외처리

구매 혜택이 있는 경우 구매 혜택이 없는 경우

   

< 코드 일부 발췌 >

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
.
.
.

try:  # 구매 혜택이 없는 경우
            book_price = driver.find_element_by_xpath(
                "//*[@id='yDetailTopWrap']/div[2]/div[2]/div[1]/div[1]/table/tbody/tr[2]/td/span/em")

        except:  # 구매 혜택이 있을 경우
            book_price = driver.find_element_by_xpath(
                "//*[@id='yDetailTopWrap']/div[2]/div[2]/div[1]/div[2]/table/tbody/tr[2]/td/span/em")

 

     ②  동일한 도서를 여러 사람이 신청하는 경우에 대해 수량을 수정하여 카트에 넣는 부분을 코드로 적용

 

 

      ③ 신청받은 도서 중 절판, 일시품절 등의 예외적인 경우에 대해 카트에 넣는 것을 제외하고 결과 파일에 따로 표시

            (판매중, 예약판매 도서만 카트에 넣기)

 

 

<코드 일부 발췌 : 도서 카트에 넣는 부분 - element_by_name , element_by_xpath 활용 >

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
.
.
.



# 판매중인 경우에만 넣고 일시품절, 절판 등 예외적인 경우에는 신청 엑셀파일 해당 도서에 표시하도록 한다.
        if state.text == "판매중" or state.text == "예약판매":
            driver.find_element_by_name('ORD_GOODS_CNT').clear()
            driver.find_element_by_name('ORD_GOODS_CNT').send_keys(qtry)
            driver.find_element_by_xpath('//*[@id="addToCartForDetail"]').send_keys(Keys.ENTER)
            driver.implicitly_wait(1)
            driver.find_element_by_xpath('//*[@id="dPop_cartWide"]/div/div/div[2]/div/a[1]/span').click()
            parent.textBrowser.append("카트 추가 완료"+"\n")
            fn_sheet['L' + str(row_index)].value = "OK"  # 장바구니에 성공적으로 추가하였으면 OK 출력
            # 주소에 http:// 들어가야 실행 가능
            # yes24 검색 데이터만 실행 가능(네이버를 통한 주소의 경우 에러 걸림)

 

 

 

 

3) openpyxl 활용한 엑셀 결과 파일 출력

 

 

  -. 엑셀에 입력 된 판매가 정보와 실제 링크에서 크롤링해 온 판매가 정보를 비교해서 맞는지 결과를 엑셀 파일에 입력하고 저장.

 

<결과.xlsx>

 

728x90