셀레니움 웹 크롤링 봇 탐지 우회 2탄 네이버 로그인 캡차 피하기

이 글은 지난 시간에 다룬 셀레니움 웹 크롤링 봇 탐지 우회 글을 기초로 하고 있으니 처음 오신 분들은 위 글을 먼저 보길 권한다. 네이버에서 로그인을 시도하면 로봇임을 탐지하는 캡차(captcha) 가 뜬다. 이를 뜨지 않게하고 네이버에 온전히 로그인하는 방법을 소개한다.


 

네이버 로그인

네이버에 사람손으로 로그인을 하면 문제 없이 로그인이 잘되는데 이상하게 셀레니움으로 아이디와 비밀번호를 입력하고 로그인을 시도하면 자동로그인 방지 문자가 뜬다. 이를 캡챠(captcha) 라고 부른다. 네이버는 사람 손과 셀레니움을 어떻게 구분하는 것일까?

네이버 로그인 방지 캡챠 화면

 

캡챠가 뜨는 이유

지난 글 셀레니움 웹 크롤링 봇 탐지 우회 에서 캡챠를 띄우는 원리를 간단하게 설명하였다. 한마디로 줄이자면 셀레니움 브라우저 세팅을 일반인들이 쓰는 브라우저와 똑같이 세팅하고 아이디와 비밀번호를 치는 곳에서 자바스크립트를 사용하지 않으면 된다.

캡챠가 안뜨게 하는법

자바스크립트를 안쓰고 로그인 하는 방법은 쉽게 말하면 element 의 click(), send_keys() 와 같은 메소드를 피하는 것이다. 그렇다면 로그인 아이디와 비번을 로그인창에 어떻게 쓰라는 말인가? send_keys 를 사용하지 않고 복사해서 붙여넣기를 하던가. 혹은 미리 아이디와 비밀번호를 크롬에 저장해두고 자동으로 계정정보가 입력되면 그냥 엔터만 누르면 된다.

복붙

클립보드에 문자열을 복사해넣고 붙여넣기를 할 수 있는 pyperclip 이라는 라이브러리를 설치해야한다.

pip install pyperclip

pyperclip.copy(내용) 을 하면 내용이 클립보드에 복사가 되어진다. 복사된 내용을 네이버 로그인창에 붙여넣기로 해주면 된다. 여기서 질문을 할 수 있다. 아니 붙여넣기할 때 send_keys 메소드로 Ctrl + V 를 사용하는데 그럼 자바스크립트를 사용한게 아니냐고 할 수 있다. 음 엄밀히 말하자면 쓴 것이 맞지만, 네이버에서 이 방법으로 해도 먹혀들고 있으니 편의상 이렇게 쓴다. 참고로 구글에서는 이 방법이 통하지 않는다.

자 그럼 긴 말은 생략하고 일단 코드부터 보자.

from selenium import webdriver
import subprocess
import chromedriver_autoinstaller
import pyperclip

try:
    subprocess.Popen(r'C:\Program Files\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrometemp1"')  # 디버거 크롬 구동
except:
    subprocess.Popen(r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrometemp1"')  # 디버거 크롬 구동
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('./')
    driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=option)
driver.implicitly_wait(20)

# 네이버 로그인
driver.get('https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com')
sleep(0.5) #혹시 모를 에러 방지를 위한 적절한 wait 넣어주기

id = 'naverid'
pw = 'naverpw'

pyperclip.copy(id)
driver.find_element_by_id('id').send_keys(Keys.CONTROL + 'v')
pyperclip.copy(pw)
driver.find_element_by_id('pw').send_keys(Keys.CONTROL + 'v')
sleep(0.7)
driver.find_element_by_id('log.login').click()
sleep(1)

 

크롬 자동 계정 입력 이용

크롬 네이버 자동로그인 기능

 

미리 크롬에 아이디와 비밀번호를 입력하고 자동로그인을 설정해두었다면, 네이버 페이지로 이동해서 로그인 버튼을 누르기만해도 아이디와 비밀번호가 자동으로 입력된다. 이 때 로그인 버튼 누르는 것은 click() 메소드를 사용해도 무방하다. 그럼 셀레니움에서는 로그인 버튼만 element 의 click() 메소드로 클릭해주기만 해도 네이버 로그인은 온전하게 잘 이루어진다.

여기서 주의해야 할 점은 이전 글에서 디버거 크롬을 구동하는 방법을 소개하면서 디버거 크롬을 열때마다 자동으로 쿠키를 삭제하는 방법을 소개하였었다. 그러나 그 방법을 사용하게 되면 크롬에 저장해둔 자동로그인 아이디와 비밀번호 정보까지 사라지기 때문에 쿠키 캐쉬 저장폴더를 삭제하지 말고 유지해주어야 한다.

11 thoughts on “셀레니움 웹 크롤링 봇 탐지 우회 2탄 네이버 로그인 캡차 피하기”

  1. 같은 코드로 실행했는데 캡챠가 계속해서 발생하네요…
    그래서
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.common.keys import Keys

    import subprocess
    import chromedriver_autoinstaller
    import pyperclip
    import pyautogui

    import time

    try:
    subprocess.Popen(r’C:\Program Files\Google\Chrome\Application\chrome.exe –remote-debugging-port=9222 –user-data-dir=”C:\chrometemp1″‘) # 디버거 크롬 구동
    except:
    subprocess.Popen(r’C:\Program Files (x86)\Google\Chrome\Application\chrome.exe –remote-debugging-port=9222 –user-data-dir=”C:\chrometemp1″‘) # 디버거 크롬 구동
    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(‘./’)
    driver = webdriver.Chrome(f’./{chrome_ver}/chromedriver.exe’, options=option)
    driver.implicitly_wait(20)

    # 네이버 로그인
    driver.get(“https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com”)
    time.sleep(1)

    pyautogui.press(“enter”)

    time.sleep(1)

    # 혹시 모를 에러 방지를 위한 적절한 wait 넣어주기

    # 아이디 입력
    driver.find_element_by_id(‘id’)
    pyautogui.typewrite(“PW”, interval=0.1)
    pyautogui.press(“tab”)

    # # PWD를 입력
    # id = driver.find_element_by_id(“pw”)
    pyautogui.typewrite(“PW”, interval=0.1)
    pyautogui.press(“enter”)

    time.sleep(1)

    이렇게 코드를 바꾸어서 최대한 다른 메소드들로 실행했는데도 같은 오류가 발생합니다.
    혹시 해결 가능할까요?

    응답
    • 경험상 아이디 문제 또는 쿠키의 문제로 보입니다. 네이버는 특정 아이디로 의심되는 로그인이 자주되면 셀레니움 사용을 떠나서 캡차를 물어보기도 합니다. 다른 아이디로 테스트해보시고 특정 아이디에만 캡차가 뜨는 것이라면 아이디문제로 결론내릴 수 있겠습니다.

      응답
  2. 문의 드립니다! 다른 게시판이나 블로그 등 다른곳에서는 댓글 기능을 실행시켰으나, N 카페에는 게시판 외 xpath 를 못불러오는데 이를 어떻게 해결해야 할까요 ㅠㅠ
    1번
    buttons = wait.until(EC.presence_of_element_located((By.XPATH,”//*[contanins(text(),’댓글을 남겨보세요’)]”)))
    text = buttons.text

    2번
    path = ‘//*[@id=”app”]/div/div/div[3]/div[1]/a[1]/span’
    path_text = driver.find_element_by_xpath(path).click()

    1번,2번 외 다른 방법으로 시도를 해봤지만 모두 에러가 납니다.
    1번의 경우

    —————————————————————————
    TypeError Traceback (most recent call last)
    in
    11 #wait.until(EC.element_to_be_clickable((By.XPATH, “//span[@class=’blind’]”))).click()
    12
    —> 13 buttons = wait.until(EC.presence_of_element_located((By.XPATH,”//*[contanins(text(),’댓글을 남겨보세요’)]”)))
    14 text = buttons.text
    15

    TypeError: until() missing 1 required positional argument: ‘method’

    이런 에러가 났고

    2번의 경우
    NoSuchElementException: Message: no such element: Unable to locate element: {“method”:”xpath”,”selector”:”//*[@id=”app”]/div/div/div[3]/div[1]/a[1]/span”}
    (Session info: chrome=91.0.4472.124)

    에러가 발생했습니다.

    N 카페에서 막혀서 이러한 현상이 나타나는걸까요?

    응답
  3. 안녕하세요. 다름이아니라 업무상 매일 공인사이트에서 매일 파일을 다운받아야하는 상황에있는데
    다운받기 누르면 새창이 열리면서 캡챠인증이떠서 자동화하기를 포기했거든요.. 혹시 이방법으로도 가능할까요??
    정말 간절해서 그런데 도움 좀 주시면 감사하겠습니다..

    응답

Leave a Comment