Selenium 네이버 로그인(headless 모드)

지인의 부탁으로 자동화 프로그램을 제작하게 되었습니다. 네이버에 로그인한 뒤 데이터를 가져오는 단순한 동작으로, 공부도 할 겸 제작하게 되었습니다. 제작 과정에서 headless 모드를 사용하면 동작하지 않는 문제가 발생했는데, 저와 동일한 문제를 겪은 분들이 있을 것 같아 글로 공유합니다.


네이버 로그인 코드(GUI 모드)

네이버 로그인 시 Selenium을 사용하면 봇으로 감지되어 보안 캡챠가 나타납니다. 여러 블로그를 참고해 보면, 클립보드에 복사한 후 붙여넣는 방식으로 이 문제를 해결하고 있습니다.

import time
import pyperclip
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options


_id = "아이디"
_pw = "비밀번호"

options = Options()
options.add_argument(
    'user-agent=Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
)

driver = webdriver.Chrome(options=options)
driver.get("https://nid.naver.com/nidlogin.login")
time.sleep(1)

# 아이디
id_input = driver.find_element(By.ID, "id")
id_input.click()
pyperclip.copy(_id)
actions = ActionChains(driver)
actions.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()
time.sleep(1)

# 비밀번호
pw_input = driver.find_element(By.ID, "pw")
pw_input.click()
pyperclip.copy(_pw)
actions = ActionChains(driver)
actions.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()
time.sleep(1)

# 로그인
driver.find_element(By.ID, "log.login").click()
time.sleep(2)

driver.quit()
ezgif 7ef568b243766

네이버 로그인 코드(Headless 모드)

위에서 작성한 코드가 정상적으로 동작하는 것을 확인했으니 options에 headless만 추가하면 될 것입니다.

...
options = Options()
options.add_argument("--headless")
...

하지만 headless 모드로 실행하면 원하는 대로 동작하지 않을 뿐만 아니라, 브라우저가 보이지 않아 정상적으로 수행되는지 확인하기 어렵습니다. 실행 상태를 확인하기 위해 중간 과정에서 스크린샷을 저장하는 코드를 추가합니다.

...
driver = webdriver.Chrome(options=options)
driver.get("https://nid.naver.com/nidlogin.login")
time.sleep(1)
driver.save_screenshot("screenshot1.png")

# 아이디
...
driver.save_screenshot("screenshot2.png")

# 비밀번호
...
driver.save_screenshot("screenshot3.png")

# 로그인
...
driver.save_screenshot("screenshot4.png")

driver.quit()
ezgif 7b262e5956d97

스크린샷을 확인한 결과, 속성을 찾고 클릭하는 것은 정상적으로 수행되었으나, 붙여넣기 동작은 수행되지 않았습니다.
정확한 원인은 찾지 못했지만 키보드 이벤트가 제한되는 것으로 보여 자바스크립트 코드로 아이디와 비밀번호를 입력했습니다.

최종 코드

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options


_id = "아이디"
_pw = "비밀번호"

options = Options()
options.add_argument("--headless")
options.add_argument(
    'user-agent=Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
)

driver = webdriver.Chrome(options=options)
driver.get("https://nid.naver.com/nidlogin.login")
time.sleep(1)

# 아이디
id_input = driver.find_element(By.ID, "id")
id_input.click()
driver.execute_script(f"document.getElementById('id').value = '{_id}';")
time.sleep(1)

# 비밀번호
pw_input = driver.find_element(By.ID, "pw")
driver.execute_script(f"document.getElementById('pw').value = '{_pw}';")
pw_input.click()
time.sleep(1)

# 로그인
driver.find_element(By.ID, "log.login").click()
time.sleep(2)

driver.quit()

자바스크립트를 사용하기 때문에 봇으로 감지될까 걱정했지만, 작성일 기준으로 한 달 정도 매일 자동화 프로그램을 사용한 결과, 문제가 발생하지 않았습니다.


참고 자료

Python & Selenium으로 네이버 로그인 자동화: 보안 캡챠 회피 방법
Selenium으로 네이버 자동 로그인