[Python] 자동 로그인, 구매 등 매크로 만들기 (selenium 사용)

fluideun·2022년 1월 20일
0

selenium

목록 보기
1/1

웹 사이트 열기 (chrome)

먼저 chromedriver-autoinstaller, selenium을 다운받고 코드를 실행해야 합니다.

# 파일명 : main.py

import chromedriver_autoinstaller

chromedriver_autoinstaller.install()

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

driver = get_selenium_driver(False)
driver.get('웹 사이트 주소 입력')

프로젝트 안에서 새 Python File을 열고 다음 코드를 입력합니다.

# 파일명 : sutils.py

from selenium import webdriver

def get_selenium_driver(headless=True):
    chrome_options = webdriver.ChromeOptions()
    if headless:
        chrome_options.add_argument('--headless')

    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('lang=en')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument("disable-gpu")
    chrome_options.add_argument("disable-infobars")
    chrome_options.add_argument("--disable-extensions")

    driver = webdriver.Chrome(options=chrome_options)
    driver.set_window_size(1920, 1080)
    return driver

만약 위 코드를 사용하고 자동 로그인(아래에 코드 있음)을 시도했을 때 로그인이 막힌다면, 다음 코드를 main.py에 입력합니다. (이 코드를 사용할 때는 sutils.py가 필요없습니다.)
다음 코드를 입력해도 로그인이 막힌다면, 저도 잘 모릅니다 ..

import chromedriver_autoinstaller

chromedriver_autoinstaller.install()

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.chrome.options import Options
import subprocess

def get_original_chrome_driver():
    subprocess.Popen(r'C:\Program Files\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrometemp"')  
                       # chrome이 있는 위치를 적어줍니다.

    option = Options()
    option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

    chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
    try:
        driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=option)
    except:
        chromedriver_autoinstaller.install(True)
        driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=option)
    driver.implicitly_wait(10)
    driver.set_window_size(1920, 1080)
    return driver

driver = get_original_chrome_driver()
driver.get('웹 사이트 주소 입력')

(이제부터 나오는 코드들은 main.py에 입력합니다.)

자동 로그인

먼저 예시를 보여드리겠습니다.
저는 나이키 로그인을 시도해봤습니다.

id = '아이디 입력'
pw = '비밀번호 입력'

try:
    WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.CLASS_NAME, 'login')))
    elem_btn = driver.find_element(By.CLASS_NAME, 'login')
    elem_btn.click() # 버튼 클릭

    WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, 'j_username')))
    elem_id = driver.find_element(By.ID, 'j_username')
    elem_id.send_keys(id) # id 입력

    WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, 'j_password')))
    elem_pw = driver.find_element(By.ID, 'j_password')
    elem_pw.send_keys(pw)

    login_btn = driver.find_element(By.XPATH, '//button[@class="button large width-max"]')
    login_btn.click()
except: # 이미 로그인이 되어있는 경우
    pass 

위 코드를 보면

WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.CLASS_NAME, 'login')))
elem_btn = driver.find_element(By.CLASS_NAME, 'login')
elem_btn.click()

이러한 형태의 코드가 계속 반복됩니다.
WebDriverWait(driver, 3) : 창이 뜰 때까지 최대 3초 기다린다는 뜻
By.CLASS_NAME, 'login' , By.XPATH, '//button[@class="button large width-max"]' , ...
: 웹 사이트에서 F12를 누른 후 클릭하고 싶은, 또는 입력하고 싶은 곳을 찾아 코드를 작성합니다. 위 코드는 나이키 로그인에 맞는 코드이므로 다른 사이트에 적용하려면 수정해야합니다.

자동 구매

구매도 똑같습니다.

WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.CLASS_NAME, 'login')))
elem_btn = driver.find_element(By.CLASS_NAME, 'login')
elem_btn.click()

이 코드를 수정하여 사용합니다.

마지막에 아래의 코드를 작성한 후, 실행합니다.

import time

time.sleep(600) # 600초 동안 창이 꺼지지 않음

driver.close()

1개의 댓글

comment-user-thumbnail
2022년 5월 11일

안녕하세요. add_experimental_option() 디버거 를 이용하면 UA 변경을 포함한 모든 add_argument 옵션들이 먹통이 되던데, 디버거와 옵션들을 동시에 사용할 수 있을까요

답글 달기