본문 바로가기

도움되는 정보

파이썬을 이용한 네이버 스마트 스토어 구매 매크로(웹크롤링)

728x90

1. 먼저 셀리니움을 설치한다.

#pip install selenium
from selenium import webdriver
import time

2. 크롬드라이버를 설치했다는 가정 하에 webdriver의 Chrome 메서드를 통해 크롬드라이버를 실행시켜준다. 이렇게 하면 이제 코드로 제어할 수 있는 빈 크롬창이 띄워진다.

driver = webdriver.Chrome('D:\chromedriver_win32\chromedriver.exe')

3. 내가 구입하고자 하는 노르디스크 텐트의 경우 재고가 없으면 아예 구매하기 버튼이 없다.
따라서 다른 구매가능한 상품의 HTML과 비교해보면 아래와 같은 차이가 있다.

'''

구매가능한 경우,

<ul class="_3YA58cPPsy">
    <li class="_3nAZvQO51p N=a:pcs.buy">
        <a href="javascript:void(0)" class="OgETmrvExa">

구매불가한 경우,

<ul class="_3YA58cPPsy">
    <li class="_3nAZvQO51p">
        <div class="Opj27DeYuO">
            <a href="javascript:void(0)" role="button" class="_39-ECjV6I9"><span class="blind">톡톡문의

'''
'\n\n구매가능한 경우,\n\n<ul class="_3YA58cPPsy">\n    <li class="_3nAZvQO51p N=a:pcs.buy">\n        <a href="javascript:void(0)" class="OgETmrvExa">\n\n구매불가한 경우,\n\n<ul class="_3YA58cPPsy">\n    <li class="_3nAZvQO51p">\n        <div class="Opj27DeYuO">\n            <a href="javascript:void(0)" role="button" class="_39-ECjV6I9"><span class="blind">톡톡문의\n\n'

4. 이제 본격적으로 크롤링을 시작해야하는데, 전체적인 알고리즘은 다음과 같다.

  1. 사이트 접속
  2. 구매가능여부 판정
    • 구매 가능하다면 옵션선택으로,
    • 구매 불가능하다면 다시 새로고침
  3. 옵션 선택
  4. 구매하기 버튼 누르기
  5. 결제하기
    • 일반결제(중 나중에 결제 선택)
    • 동의하기
    • 주문하기

4.1. 먼저 알고리즘에 따라 선택할 버튼들의 xpath 를 모두 저장해준다.

# xpath1 은 구매불가능한 경우, xpath2 는 구매가능한 경우.
xpath1 = "//ul[@class='_3YA58cPPsy']"
xpath2 = "//li[@class='_3nAZvQO51p N=a:pcs.buy']"

# xpath3, 4 는 그 밑에 클래스
xpath3 = "//ul[@class='_3YA58cPPsy']/li"
xpath4 = "//li[@class='_3nAZvQO51p N=a:pcs.buy']/a"

# 옵션 선택
xpath_opt = '//div[@class="_3NaJVRY_EO"]'
xpath_opt2 = "//div[@class='_3NaJVRY_EO']/ul/li[1] "

# 결제하기
  # 일반결제 선택
xpath_generalpay = "//span[@class='ajax_radio radio-applied _payMethodRadio']"
  # 나중에결제 선택
xpath_laterpay = '//span[@class="ajax_radio radio-applied _payMeansClassRadio _payMeanSkip"]'
  # 동의하기
xpath_agree = "//span[@id = 'allAgree']"
  # 주문하기
xpath_order = "//span[@class= 'txt_order']"

4.2. 구매하고자 하는 상품의 url 을 저장해주고, driver.get(url) 함수를 통해 빈크롬창을 해당 url로 이동시킨다.
(위의 url이 진짜 원하는 품절상품이고 아래 url은 품절되지 않은 상품으로 크롤링 코드를 만들기 위해 참조한 url이다.

#url = 'https://smartstore.naver.com/allaboutstore/products/4518009388' # 품절상품(원하는 상품)
url= 'https://smartstore.naver.com/allaboutstore/products/5225814038' # 구매가능상품
driver.get(url)

4.3. 구매가능여부에 따라 웹크롤링을 실행한다.

path3의 class 속성은 구매버튼 존재여부에 따라 달라진다. 즉, 달라지는 속성값으로 구매가능여부를 판정하여 if문에 넣고 돌리면 됨.

중간중간 driver.implicitly_wait(seconds) 를 사용해서 로딩이 되기 전에 다음코드가 실행되는 것을 방지해준다.

aa = driver.find_element_by_xpath(xpath3).get_attribute('class')
while True:
    try:
        if aa =='_3nAZvQO51p N=a:pcs.buy':
            print('구매가능')

            #옵션선택
            #driver.find_element_by_xpath(xpath_opt).click()
            #driver.find_element_by_xpath(xpath_opt2).click()
            #구매버튼
            driver.find_element_by_xpath(xpath2).click()
            driver.implicitly_wait(1)
            # 결제하기
            driver.find_elements_by_xpath(xpath_generalpay)[2].click()
            driver.implicitly_wait(1)
            driver.find_element_by_xpath(xpath_laterpay).click()
            # 동의하기
            driver.implicitly_wait(1)
            driver.find_element_by_xpath(xpath_agree).click()
            # 주문하기
            driver.implicitly_wait(1)
            driver.find_element_by_xpath(xpath_order).click()
            break
        else:
            print('구매불가')
            driver.refresh()
            driver.implicitly_wait(1)

    except Exception:
        driver.refresh()
        driver.implicitly_wait(1)

구매가능

참고로 중간에 네이버로그인을 수동으로 해야함(자동으로 할 수 있겠지만 귀찮음)

그냥 로그인 해놓고 매크로 돌리면 되기 때문

마지막 주문하기가 클릭이 되고 간편결제비밀번호 또한 수동으로 쳐야함.

728x90

'도움되는 정보' 카테고리의 다른 글

SSH 란 무엇일까?  (0) 2021.02.14