네이버 쇼핑 구매

1. 로그인 버튼 클릭

image

# 버튼이 생기고 클릭할 수 있는 상태가 될때까지 기다리기
login_button = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'a#gnb_login_button'))) # a태그의 gnb_login_button
login_button.click() # 로그인 버튼 클릭
2. 아이디 비밀번호 입력하기

image

input_id = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input#id')))
input_pw = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input#pw')))

# pyperclip으로 자동로그인 방지 해제
pyperclip.copy('본인아이디') # 아이디 클립보드에 복사
input_id.send_keys(Keys.CONTROL, 'v') # 붙여넣기
pyperclip.copy('본인비밀번호')
input_pw.send_keys(Keys.CONTROL, 'v') 
input_pw.send_keys('\n') # 엔터

'''
input_id.send_keys('본인아이디')
input_pw.send_keys('본인비밀번호')
input_pw.send_keys('\n')
3. 로그인 되었는지 확인하기

image

# 로그인 되었는지 확인 (로그아웃 버튼이 있으면 로그인이 성공한 것임)
short_wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a#gnb_logout_button')))
4. 상품 검색

image

# 상품 검색
search = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input[class=_searchInput_search_text_3CUDs]')))
search.send_keys('아이폰 케이스')
time.sleep(1)
search.send_keys('\n')

5. 상품 목록 뽑아보기 및 광고 거르기

image

image

# 스크롤 내리기 (JS를 셀레니움이 실행하게 만듦)
# chrome.execute_script('window.scrollBy(0, document.body.scrollHeight)') # x로는 움직이지 않고, y로 최대로 이동
for i in range(8):
    chrome.execute_script("window.scrollBy(0, "+ str((i+1)*1000) +")")
    time.sleep(1) # 스크롤 내리고 로딩되는 것 잠깐 기다리기

# 상품 리스트 (div 태그인데 class 이름이 basicList_info_area__로 시작하는 애들 가져오기)
# 추후에 광고를 제거하기 위해 sibling node 참조를 위해 검색을 div로 함 (셀레니움은 parent로 가는것이 한정적이라 공통분모를 찾아야 함)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[class^=basicList_info_area__]")))
items = chrome.find_elements(By.CSS_SELECTOR, "div[class^=basicList_info_area__") # 모든 div태그 가져오기
for item in items:
    # 광고 거르기
    try:
        item.find_element(By.CSS_SELECTOR, "button[class^=ad_]")
        continue
    except:
        pass
    print(item.find_element(By.CSS_SELECTOR, 'a[class^=basicList_link__').text)
6. 상품 선택하고 옵션 선택하기

image

image

# 상품 클릭 (첫번째 상품 구매한다고 가정)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a[class^=basicList_link__"))).click()
time.sleep(2) # 새로운 탭이 열릴 시간을 줌
print(chrome.title)  # 현재 창의 제목 (아이폰 케이스 : 네이버 쇼핑) -> 꺼진 탭의 제목

# 새로운 탭 연결
print(chrome.window_handles) # 창의 이름 출력 -> ['CDwindow-D6A7AA055EE2E7636053E2A9F78391CE', 'CDwindow-1C5BBA469099DE8E361BB1CF8BD83952']
chrome.switch_to.window(chrome.window_handles[1]) # 탭 연결 전환
print(chrome.title) # 새로운 탭 이름 (독보적인 설계, 정교한 디테일. 아이폰 14 x UAG의 완벽한 만남 : UAGKOREA)

# 옵션 선택
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a[aria-haspopup='listbox']")))
ops = chrome.find_elements(By.CSS_SELECTOR, "a[aria-haspopup='listbox']")

ops[0].click() # 첫번째 옵션 클릭
time.sleep(1)
chrome.find_element(By.CSS_SELECTOR, "ul[role=listbox] li:nth-child(1) a[role=option]").click() # ul 태그의 자식 노드중에 첫번쨰 li 태그에서 a태그 중에 role이 option인것 선택

ops[1].click() # 두번째 옵션 클릭
time.sleep(1)
chrome.find_element(By.CSS_SELECTOR, "ul[role=listbox] li:nth-child(1) a[role=option]").click()
7. 구매하기 버튼 누르기

image

# 구매하기 버튼 누르기
chrome.find_element(By.CSS_SELECTOR, "div[class*='N=a:pcs.buy'] a").click()

time.sleep(5)

chrome.close() # 크롬과 연결되어 있는 탭을 끄기
chrome.quit() # 연결되어 있지 않은 탭도 끄기
전체코드
import os
from re import T
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time
import os
import pyperclip

options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])

chrome = webdriver.Chrome('./chromedriver.exe', options=options)
wait = WebDriverWait(chrome, 10)
short_wait = WebDriverWait(chrome, 3)

chrome.get('https://shopping.naver.com')

'''
버튼이 생길때 까지 기다리기 (버튼이 생긴다고 클릭할 수 있는 상태가 아닐 수도 있음)
login_button = wait.until(EC.presence_of_all_elements_located(By.CSS_SELECTOR, 'a#gnb_login_button')) # a태그의 gnb_login_button
'''
# 버튼이 생기고 클릭할 수 있는 상태가 될때까지 기다리기
login_button = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'a#gnb_login_button'))) # a태그의 gnb_login_button
login_button.click() # 로그인 버튼 클릭

input_id = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input#id')))
input_pw = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input#pw')))

# pyperclip으로 자동로그인 방지 해제
pyperclip.copy('본인아이디') # 아이디 클립보드에 복사
input_id.send_keys(Keys.CONTROL, 'v') # 붙여넣기
pyperclip.copy('본인비밀번호')
input_pw.send_keys(Keys.CONTROL, 'v') 
input_pw.send_keys('\n') # 엔터

'''
input_id.send_keys('본인아이디')
input_pw.send_keys('본인비밀번호')
input_pw.send_keys('\n')
'''

# 로그인 되었는지 확인 (로그아웃 버튼이 있으면 로그인이 성공한 것임)
short_wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a#gnb_logout_button')))

# 상품 검색
search = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input[class=_searchInput_search_text_3CUDs]')))
search.send_keys('아이폰 케이스')
time.sleep(1)
search.send_keys('\n')

# 스크롤 내리기 (JS를 셀레니움이 실행하게 만듦)
# chrome.execute_script('window.scrollBy(0, document.body.scrollHeight)') # x로는 움직이지 않고, y로 최대로 이동
for i in range(8):
    chrome.execute_script("window.scrollBy(0, "+ str((i+1)*1000) +")")
    time.sleep(1) # 스크롤 내리고 로딩되는 것 잠깐 기다리기

# 상품 리스트 (div 태그인데 class 이름이 basicList_info_area__로 시작하는 애들 가져오기)
# 추후에 광고를 제거하기 위해 sibling node 참조를 위해 검색을 div로 함 (셀레니움은 parent로 가는것이 한정적이라 공통분모를 찾아야 함)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[class^=basicList_info_area__]")))
items = chrome.find_elements(By.CSS_SELECTOR, "div[class^=basicList_info_area__") # 모든 div태그 가져오기
for item in items:
    # 광고 거르기
    try:
        item.find_element(By.CSS_SELECTOR, "button[class^=ad_]")
        continue
    except:
        pass
    print(item.find_element(By.CSS_SELECTOR, 'a[class^=basicList_link__').text)

# 상품 클릭 (첫번째 상품 구매한다고 가정)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a[class^=basicList_link__"))).click()
time.sleep(2) # 새로운 탭이 열릴 시간을 줌
print(chrome.title)  # 현재 창의 제목 (아이폰 케이스 : 네이버 쇼핑) -> 꺼진 탭의 제목

# 새로운 탭 연결
print(chrome.window_handles) # 창의 이름 출력 -> ['CDwindow-D6A7AA055EE2E7636053E2A9F78391CE', 'CDwindow-1C5BBA469099DE8E361BB1CF8BD83952']
chrome.switch_to.window(chrome.window_handles[1]) # 탭 연결 전환
print(chrome.title) # 새로운 탭 이름 (독보적인 설계, 정교한 디테일. 아이폰 14 x UAG의 완벽한 만남 : UAGKOREA)

# 옵션 선택
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a[aria-haspopup='listbox']")))
ops = chrome.find_elements(By.CSS_SELECTOR, "a[aria-haspopup='listbox']")

ops[0].click() # 첫번째 옵션 클릭
time.sleep(1)
chrome.find_element(By.CSS_SELECTOR, "ul[role=listbox] li:nth-child(1) a[role=option]").click() # ul 태그의 자식 노드중에 첫번쨰 li 태그에서 a태그 중에 role이 option인것 선택

ops[1].click() # 두번째 옵션 클릭
time.sleep(1)
chrome.find_element(By.CSS_SELECTOR, "ul[role=listbox] li:nth-child(1) a[role=option]").click()

# 구매하기 버튼 누르기
chrome.find_element(By.CSS_SELECTOR, "div[class*='N=a:pcs.buy'] a").click()

time.sleep(5)

chrome.close() # 크롬과 연결되어 있는 탭을 끄기
chrome.quit() # 연결되어 있지 않은 탭도 끄기