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. 이제 본격적으로 크롤링을 시작해야하는데, 전체적인 알고리즘은 다음과 같다.
- 사이트 접속
- 구매가능여부 판정
- 구매 가능하다면 옵션선택으로,
- 구매 불가능하다면 다시 새로고침
- 옵션 선택
- 구매하기 버튼 누르기
- 결제하기
- 일반결제(중 나중에 결제 선택)
- 동의하기
- 주문하기
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 |
---|