파이썬에서 셀레니움을 사용해 CAPTCHA 우회하는 방법

이 포괄적인 튜토리얼로 Selenium에서 CAPTCHA 우회 방법을 배우세요. 웹 스크래핑 시 CAPTCHA 문제를 처리하는 실용적인 기법을 알아보세요.
3 분 읽기
How to bypass CAPTCHAs with Selenium blog image

이 셀레니움 CAPTCHA 우회 튜토리얼에서 다음을 배우게 됩니다:

  • CAPTCHA란 무엇이며 우회 가능한지 여부
  • Selenium에서 CAPTCHA 우회하는 방법
  • CAPTCHA가 여전히 표시될 경우의 대처 방법

자, 시작해 보겠습니다!

CAPTCHA란 무엇이며 우회할 수 있을까?

CAPTCHA는“컴퓨터와 인간을 구분하기 위한 완전 자동화된 공개 튜링 테스트(Completely Automated Public Turing test to tell Computers and Humans Apart)”의 약자로, 인간 사용자와 봇을 구분하기 위해 고안된 메커니즘입니다. 이는 인간에게는 쉽지만 기계에게는 해결하기 어려운 과제를 제시합니다. 잘 알려진 CAPTCHA 제공업체로는 Google reCAPTCHA, hCaptcha, BotDetect 등이 있습니다.

주요 CAPTCHA 유형은 다음과 같습니다:

  • 텍스트 기반 문제: 사용자는 왜곡된 문자 및 숫자 시퀀스를 입력해야 합니다.
  • 이미지 기반 과제: 사용자는 이미지 그리드에서 특정 물체를 식별해야 합니다.
  • 음성 기반 문제: 사용자는 들리는 단어를 입력해야 합니다.
  • 퍼즐 과제: 사용자는 미로 탐색과 같은 간단한 퍼즐을 해결해야 합니다.
Text CAPTCHA example

CAPTCHA는 종종 특정 사용자 흐름의 일부로 사용됩니다. 예를 들어 양식 제출 과정의 마지막 단계에서:

captcha as a step of a form submission process example

이러한 경우 CAPTCHA는 봇이 사용자 흐름을 완료하지 못하도록 방지하기 위해 존재합니다. 이러한 인증을 자동화하려면 CAPTCHA 해결 라이브러리나 실시간으로 인증을 해결하는 인간 운영자에 의존하는 서비스를 사용할 수 있습니다. 그러나 하드코딩된 CAPTCHA는 사용자 경험에 부정적인 영향을 미치기 때문에 흔하지 않습니다.

대신 CAPTCHA는 WAF( 애플리케이션 방화벽) 같은 포괄적인 봇 방지 솔루션의 일부로 더 자주 사용됩니다:

Example-of-a-Web-Application-Firewall

이러한 시스템은 봇 활동을 의심할 때 동적으로 CAPTCHA를 표시합니다. 이 경우 봇이 실제 브라우저에서 인간 행동을 모방하도록 하면 CAPTCHA를 우회할 수 있습니다. 하지만 새로운 봇 탐지 방법에 대응하려면 스크립트를 지속적으로 업데이트해야 합니다.

CAPTCHA를 피하는 더 효과적인 해결책은 Bright Data의 CAPTCHA 해결 기능과 같은 차세대 도구를 사용하는 것입니다. 이 클라우드 도구는 항상 최신 상태를 유지하며 다양한 유형의 CAPTCHA를 처리해 줍니다.

셀레늄 CAPTCHA 처리: 단계별 튜토리얼

방금 배운 바와 같이, CAPTCHA를 효과적으로 회피하는 방법은 실제 브라우저 지문을 사용해 브라우저를 제어하면서 자동화 스크립트가 인간 행동을 모방하도록 하는 것입니다. 이를 위한 최고의 도구 중 하나는 인기 있는 브라우저 자동화 라이브러리인 Selenium입니다.

이 튜토리얼 섹션에서는 Python 스크립트를 사용하여 Selenium에서 CAPTCHA를 피하는 방법을 배울 것입니다. 시작해 보겠습니다!

1단계: 새 Python 프로젝트 생성

시작하기 전에 로컬에 Python 3Chrome이 설치되어 있는지 확인하세요.

이미 Selenium 웹 스크래핑 또는 테스트 스크립트가 있다면 처음 세 단계를 건너뛸 수 있습니다. 그렇지 않다면 Selenium CAPTCHA 우회 데모 프로젝트용 폴더를 생성하고 터미널에서 해당 폴더로 이동하세요:

mkdir selenium_demo

cd selenium_demo

다음으로, 해당 폴더 내에 새로운 Python 가상 환경을 추가하세요:

python -m venv venv

선호하는 Python IDE에서 프로젝트 폴더를 열고 script.py라는 새 파일을 생성하세요.

훌륭합니다! 이제 프로젝트 폴더에 Python 애플리케이션이 포함되었습니다.

2단계: 셀레니움 설치

아래 명령어로 Python 가상 환경을 활성화하세요:

venvScriptsactivate

또는 Linux 또는 macOS 사용자의 경우 동등하게 다음을 실행하세요:

source venv/bin/activate

그런 다음 pip 패키지를 통해 Selenium을 설치합니다:

pip install selenium

설치 과정이 다소 오래 걸릴 수 있으니 기다려 주세요.

좋습니다! 이제 Selenium 스크립트를 초기화할 준비가 되었습니다.

3단계: Selenium 스크립트 설정

script.py 파일에 다음 줄을 추가하여 Selenium을 임포트하세요:

from selenium import webdriver

이제 Chrome을 헤드리스 모드로 시작하도록 구성하기 위해 ChromeOptions 객체를 생성하세요:

options = webdriver.ChromeOptions()

options.add_argument("--headless")

이 옵션에 익숙하지 않다면 헤드리스 브라우저 가이드에서 자세히 알아보세요.

이러한 옵션으로 Chrome WebDriver 인스턴스를 초기화하고, 마지막으로 quit()으로 종료합니다. 현재 script.py 파일은 다음과 같아야 합니다:

from selenium import webdriver

# Chrome을 헤드리스 모드로 시작하도록 구성

options = webdriver.ChromeOptions()

options.add_argument("--headless")

# Chrome 인스턴스 시작

driver = webdriver.Chrome(options=options)

# 브라우저 자동화 로직...

# 브라우저 닫기 및 리소스 해제

driver.quit()

위 스크립트는 브라우저를 종료하기 전에 헤드리스 모드로 새로운 Chrome 인스턴스를 실행합니다. 훌륭합니다! 이제 브라우저 자동화 로직을 구현할 차례입니다.

4단계: 브라우저 자동화 로직 추가

Selenium CAPTCHA 우회 로직을 평가하기 위해 자동화 스크립트는 bot.sannysoft.com에 연결하여 스크린샷을 찍습니다. 이 특수 웹 페이지는 브라우저에서 여러 테스트를 실행하여 사용자가 인간인지 봇인지 판단합니다. 선호하는 브라우저로 해당 페이지를 방문하면 모든 테스트가 통과되는 것을 확인할 수 있습니다.

get() 메서드를 사용하여 Chrome 인스턴스가 대상 페이지를 방문하도록 지시합니다:

driver.get("https://bot.sannysoft.com/")

그런 다음 전체 페이지의 스크린샷을 찍어야 합니다. 안타깝게도 셀레니움은 이를 직접 수행할 수 있는 기능을 제공하지 않습니다. 해결책으로 브라우저 창을 <body> 노드의 너비와 높이로 설정한 후 스크린샷을 찍을 수 있습니다:

# body 너비와 높이 가져오기

full_width = driver.execute_script("return document.body.parentNode.scrollWidth")

full_height = driver.execute_script("return document.body.parentNode.scrollHeight")

# 브라우저 창을 body 너비와 높이로 설정

driver.set_window_size(full_width, full_height)

# 전체 페이지 스크린샷 촬영

driver.save_screenshot("screenshot.png")

# 원래 창 크기 복원

driver.set_window_size(original_size["width"], original_size["height"])

위의 방법으로 스크린샷.png 파일에 전체 페이지 스크린샷이 저장됩니다.

모든 것을 합치면 다음과 같은 로직이 됩니다:

from selenium import webdriver

# Chrome을 헤드리스 모드로 시작하도록 설정

options = webdriver.ChromeOptions()

options.add_argument("--headless")

# Chrome 인스턴스 시작

driver = webdriver.Chrome(options=options)

# 대상 페이지에 연결

driver.get("https://bot.sannysoft.com/")

# 현재 창 크기 가져오기

original_size = driver.get_window_size()

# 본문의 너비와 높이 가져오기

full_width = driver.execute_script("return document.body.parentNode.scrollWidth")

full_height = driver.execute_script("return document.body.parentNode.scrollHeight")

# 브라우저 창을 본문의 너비와 높이로 설정

driver.set_window_size(full_width, full_height)

# 전체 페이지 스크린샷 촬영

driver.save_screenshot("screenshot.png")

# 원래 창 크기로 복원

driver.set_window_size(original_size["width"], original_size["height"])

# 브라우저를 닫고 리소스를 해제

driver.quit()

위의 script.py 파일을 다음 명령어로 실행합니다:

python script.py

스크립트는 헤드리스 모드에서 Chromium 인스턴스를 시작하고, 원하는 페이지에 연결한 후 스크린샷을 찍고 브라우저를 종료합니다. 스크립트 실행이 끝나면 프로젝트 루트 폴더에 screenshot.png 파일이 생성됩니다. 파일을 열면 다음과 같은 내용을 확인할 수 있습니다:

screenshot.png file example

빨간색 박스로 표시된 부분에서 알 수 있듯이, 기본 Selenium으로 제어되는 헤드리스 모드의 Chrome은 다양한 테스트를 통과하지 못합니다. 이는 스크립트가 봇으로 탐지될 가능성이 높다는 의미입니다. 결과적으로, 봇 방지 기술로 보호된 사이트에서는 상호작용 시 CAPTCHA가 표시될 수 있습니다. Selenium에서 CAPTCHA를 피하는 해결책? 바로 Stealth 플러그인입니다!

단계 #5: Selenium Stealth 플러그인 설치

Selenium Stealth는 Selenium이 제어하는 Chrome/Chromium 인스턴스가 봇으로 탐지되는 것을 줄이기 위해 설계된 Python 패키지입니다. 이 프로젝트의 목표는 브라우저를 구성하여 알려진 거의 모든 봇 탐지 전략을 우회하는 것입니다.

구체적으로 Selenium Stealth는 브라우저 속성을 수정하여 자동화된 브라우저임을 노출시키는 모든 정보 유출을 방지합니다. 봇 방지 우회 솔루션에 익숙하다면, 이 패키지는 Puppeteer Stealth의 재구현으로 볼 수 있습니다.

pip 패키지 selenium-stealth를 통해 Selenium Stealth를 설치하세요:

pip install selenium-stealth

그런 다음 script.py 파일에 다음 줄을 추가하여 라이브러리를 임포트하세요:

from selenium_stealth import stealth

이제 시작입니다! 남은 것은 스텔스 설정을 구성하는 것뿐입니다.

6단계: CAPTCHA 회피를 위한 Stealth 설정 구성

Selenium Stealth를 등록하고 Chrome WebDriver가 CAPTCHA를 회피하도록 설정하려면 다음과 같이 stealth() 함수를 호출하세요:

stealth(

driver,

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",

languages=["en-US", "en"],

vendor="Google Inc.",

platform="Win32",

webgl_vendor="Intel Inc.",

renderer="Intel Iris OpenGL Engine",

fix_hairline=True,

)

함수 인수는 원하는 대로 구성하되, 위 값만으로도 대부분의 봇 방지 조치를 우회할 수 있다는 점을 명심하세요.

잘하셨습니다! 이제 Selenium으로 제어되는 브라우저는 실제 사용자가 사용하는 브라우저로 인식됩니다.

7단계: 봇 탐지 테스트 반복

아래는 최종 script.js 파일입니다:

from selenium import webdriver

from selenium_stealth import stealth

# Chrome을 헤드리스 모드로 시작하도록 설정

options = webdriver.ChromeOptions()

options.add_argument("--headless")

# Chrome 인스턴스 시작

driver = webdriver.Chrome(options=options)

# 봇 탐지를 피하도록 WebDriver 설정

# Selenium Stealth 사용

stealth(

driver,

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",

languages=["en-US", "en"],

vendor="Google Inc.",

platform="Win32",

webgl_vendor="Intel Inc.",

renderer="Intel Iris OpenGL Engine",

fix_hairline=True,

)

# 대상 페이지에 연결

driver.get("https://bot.sannysoft.com/")

# 현재 창 크기 가져오기

original_size = driver.get_window_size()

# 문서 본문의 너비와 높이 가져오기

full_width = driver.execute_script("return document.body.parentNode.scrollWidth")

full_height = driver.execute_script("return document.body.parentNode.scrollHeight")

# 브라우저 창을 문서 본문의 너비와 높이로 설정

driver.set_window_size(full_width, full_height)

# 전체 페이지 스크린샷 캡처

driver.save_screenshot("screenshot.png")

# 원래 창 크기로 복원

driver.set_window_size(original_size["width"], original_size["height"])

# 브라우저 종료 및 리소스 해제

driver.quit()

바이패스 CAPTCHA Selenium Python 스크립트를 다시 실행합니다:

python script.py

screenshot.png를 확인해 보세요. 모든 봇 탐지 테스트를 통과했음을 알 수 있습니다:

All bot detection tests passed on the new screenshot.png

자, 이제 Selenium에서 안티봇 CAPTCHA를 피하는 방법을 알게 되었습니다.

위 CAPTCHA 우회 Selenium 솔루션이 작동하지 않을 경우

안타깝게도, 안티봇 솔루션이 주목하는 부분은 브라우저 설정만이 아닙니다. IP 평판도 또 다른 핵심 요소이며, 무료 라이브러리를 사용해 단순히 더 신뢰할 수 있는 IP로 변경할 수는 없습니다. 이를 위해서는 Selenium 프록시 통합이 필요합니다!

다시 말해, 브라우저를 최적화해도 CAPTCHA가 나타날 수 있습니다. 단일 클릭만 필요한 간단한 CAPTCHA의 경우 selenium-recaptcha-solver나 selenium-recptcha 같은 패키지를 사용해 볼 수 있습니다. 하지만 이 라이브러리들은 reCAPTCHA v2에서만 작동하며 더 이상 유지보수되지 않습니다.

이전 장의 접근법과 해당 패키지의 주요 문제점은 기본적인 CAPTCHA에만 대응한다는 점입니다. Cloudflare와 같은 더 복잡한 봇 방지 시스템을 상대할 때는 훨씬 강력한 솔루션이 필요합니다.

진정한 Selenium CAPTCHA 솔루션을 찾고 계신가요? Bright Data의 웹 스크래핑 솔루션을 사용해 보세요!

이 솔루션은 reCAPTCHA, hCaptcha, px_captcha, SimpleCaptcha, GeeTest CAPTCHA, FunCaptcha, Cloudflare Turnstile, AWS WAF Captcha, KeyCAPTCHA 등 다양한 CAPTCHA를 자동으로 처리하는 전용 CAPTCHA 해결 기능을 갖춘 뛰어난 잠금 해제 기능을 제공합니다.

Bright Data의 CAPTCHA Solver는 Selenium을 비롯한 모든 HTTP 클라이언트 또는 브라우저 자동화 도구와 호환되므로 스크립트에 쉽게 통합할 수 있습니다.

Bright Data의 CAPTCHA Solver 사용 방법에 대해 자세히 알아보고 모든 구성 세부 사항에 대한 문서를 확인하세요.

결론

이 글에서는 CAPTCHA가 자동화 소프트웨어에 도전이 되는 이유와 Selenium에서 이를 해결하는 방법을 살펴보았습니다. Selenium Stealth 라이브러리를 사용하면 Chrome의 기본 설정을 재정의하여 봇 탐지를 제한할 수 있습니다. 그러나 이 방법은 완벽한 해결책이 아닙니다.

아무리 정교한 셀레니움 CAPTCHA 우회 로직을 사용하더라도, 고급 봇 탐지 도구는 여전히 차단할 수 있습니다. 진정한 해결책은 차단되지 않는 API를 통해 대상 사이트에 연결하여 어떤 웹 페이지의 CAPTCHA 없는 HTML도 반환할 수 있도록 하는 것입니다.

이 API는 꿈이 아닙니다. 실제로 존재하며 Web Unlocker라고 불립니다. 이 스크래핑 API는 프록시 통합을 통해 요청마다 출구 IP를 자동으로 변경하고, 브라우저 지문 인식, 자동 재시도, CAPTCHA 해결을 처리해 줍니다. CAPTCHA 처리 작업이 이토록 쉬웠던 적은 없습니다!

지금 가입하여 무료 체험을 시작하세요.