Python Selenium Cloudflare 403 Forbidden 우회 방법 undetected chromedriver 실전 가이드

Selenium이나 Playwright로 크롤링을 시도할 때 Cloudflare 403 Forbidden이나 Bot Detection Challenge에 막혀본 경험이 있다면, 이 글은 당신을 위한 것입니다. 일반 ChromeDriver는 자동화 탐지 시그니처(navigator.webdriver 등)를 남기기 때문에 Cloudflare Turnstile이나 reCAPTCHA에 쉽게 차단됩니다. 본 포스팅에서는 SeleniumBase + undetected_chromedriver 조합을 활용해 봇 탐지를 우회하고, cf_clearance 쿠키를 안정적으로 발급받는 실전 전략을 다룹니다.


Python크롤링Cloudflare차단해결undetectedchromedriverreconnect전략



1. 왜 일반 Selenium은 Cloudflare에 막히는가

Cloudflare는 다음과 같은 지표를 통해 자동화된 요청을 탐지합니다:

  • navigator.webdriver 속성: Selenium 구동 시 true로 설정되어 즉시 노출됩니다.
  • User-Agent 패턴: Headless Chrome의 기본 UA는 "HeadlessChrome" 문자열을 포함합니다.
  • Chrome DevTools Protocol(CDP) 흔적: 일부 자동화 툴은 CDP 통신 패턴이 남습니다.
  • TLS Fingerprinting: 브라우저별 TLS 핸드셰이크 차이를 분석해 봇을 식별합니다.

이러한 시그니처를 제거하지 않으면 403 Forbidden 또는 Challenge Loop에 빠지게 되며, 수동으로 CAPTCHA를 풀어도 쿠키가 발급되지 않는 경우가 빈번합니다.

2. SeleniumBase + undetected_chromedriver 설정 방법

SeleniumBase는 uc=True 옵션을 통해 undetected_chromedriver의 탐지 회피 패치를 자동으로 적용합니다. 설치 및 기본 사용법은 다음과 같습니다:

2.1 설치

pip install seleniumbase

2.2 기본 코드 구조

from seleniumbase import SB

with SB(uc=True, locale="ko", test=True) as sb:
    sb.uc_open_with_reconnect("https://example.com", reconnect_time=10)
    sb.sleep(2)
    sb.assert_element("body", timeout=5)

주요 파라미터 설명:

  • uc=True: Undetected Chrome 모드 활성화. navigator.webdriver 제거 및 CDP 패치 적용.
  • locale="ko": 브라우저 언어를 한국어로 설정. Accept-Language 헤더도 자동 조정됩니다.
  • test=True: 스크린샷 자동 저장 및 로그 출력 활성화. 디버깅 시 필수입니다.

3. Cloudflare 우회 핵심 메서드: uc_open_with_reconnect

일반 driver.get()과 달리, sb.uc_open_with_reconnect()는 Cloudflare Challenge를 자동으로 처리합니다. 내부 동작 흐름은 다음과 같습니다:

  1. 초기 접속 시도: driver.get(url) 실행 후 응답 코드 확인.
  2. Challenge 탐지: Turnstile/Spinner/Challenge 페이지가 감지되면 reconnect_time(초) 동안 재접속 반복.
  3. 쿠키 발급 대기: cf_clearance 쿠키가 발급되거나, Challenge가 해제되면 정상 페이지로 진입.
  4. 실패 처리: reconnect_time 초과 시 RuntimeError 또는 TimeoutException 발생.

3.1 reconnect_time 설정 가이드

  • 5초 이하: 우회 실패 가능성 높음. Cloudflare가 쿠키를 발급하기 전에 타임아웃 발생.
  • 10~15초 (권장): 대부분의 사이트에서 안정적으로 동작. 일반적인 Challenge 소요 시간.
  • 20초 이상: 느린 네트워크 환경이나 복잡한 Challenge에 대응 가능하지만, 크롤링 속도 저하.

3.2 CAPTCHA 자동 처리 예제

from seleniumbase import SB

with SB(uc=True, locale="ko", test=True) as sb:
    sb.uc_open_with_reconnect("https://cloudflare-protected-site.com", reconnect_time=12)
    
    # Turnstile CAPTCHA가 나타나면 자동 클릭 시도
    sb.uc_gui_click_captcha()
    
    # 성공 이미지 확인 (사이트마다 selector 다름)
    sb.assert_element("img#captcha-success", timeout=3)
    
    # 이후 정상 크롤링 로직
    sb.sleep(1)
    content = sb.get_text("div.content")
    print(content)

주의사항: sb.uc_gui_click_captcha()는 iframe 내부 CAPTCHA를 자동으로 탐지하고 클릭하지만, 사이트마다 DOM 구조가 다르므로 test=True로 스크린샷을 확인하며 selector를 조정해야 합니다.

4. 실전 트러블슈팅 및 우회 성공률 높이는 팁

4.1 Headless 모드는 피하라

Cloudflare는 Headless 브라우저를 탐지하는 추가 로직을 가지고 있습니다. uc=True를 사용하더라도 headless=True를 함께 쓰면 차단 확률이 급증합니다. 반드시 GUI 모드(headless=False)로 실행하십시오.

4.2 User-Agent Rotation

동일 IP에서 반복 요청 시 차단될 수 있으므로, agent 파라미터로 User-Agent를 주기적으로 변경하는 것을 권장합니다:

with SB(uc=True, agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64)...") as sb:
    ...

4.3 Proxy 조합

동일 IP에서 대량 요청 시 IP 차단이 발생합니다. proxy 파라미터로 Residential Proxy를 사용하면 차단률을 낮출 수 있습니다:

with SB(uc=True, proxy="http://user:pass@proxy-server:port") as sb:
    ...

4.4 로그 분석으로 실패 원인 파악

test=True로 실행하면 latest_logs/ 디렉터리에 스크린샷과 로그가 자동 저장됩니다. Challenge 화면에서 멈춘 경우, 해당 스크린샷을 확인해 다음을 점검하십시오:

  • CAPTCHA iframe이 로드되었는지
  • cf_clearance 쿠키가 발급되었는지 (개발자 도구 → Application → Cookies 확인)
  • reconnect_time 내에 Challenge가 해제되었는지

5. Playwright 대안 및 비교

Playwright도 playwright-stealth 플러그인을 통해 탐지 회피가 가능하지만, Cloudflare Turnstile에 대한 성공률은 SeleniumBase + uc 모드보다 낮습니다. 이유는 다음과 같습니다:

  • Playwright는 CDP 기반이므로 CDP 통신 패턴이 Cloudflare에 노출됩니다.
  • undetected_chromedriver는 Chrome 바이너리 패치를 통해 더 깊은 수준의 우회를 제공합니다.
  • SeleniumBase는 uc_gui_click_captcha() 같은 Helper 메서드를 제공하여 CAPTCHA 처리가 간편합니다.

따라서 Cloudflare 우회가 주 목적이라면 SeleniumBase + uc=True 조합을 1순위로 권장합니다.

결론

Cloudflare Bot Detection을 우회하려면 navigator.webdriver 제거, CDP 패치, 적절한 reconnect_time 설정이 핵심입니다. SeleniumBase의 uc=True 옵션은 이 모든 과정을 자동화하며, sb.uc_open_with_reconnect()sb.uc_gui_click_captcha()를 조합하면 대부분의 Cloudflare Challenge를 안정적으로 통과할 수 있습니다.

Action Item: 지금 당장 pip install seleniumbase를 실행하고, 위 예제 코드를 복사해 차단되었던 사이트에 재접속을 시도하십시오. test=True로 로그를 확인하며 reconnect_time을 10~15초로 설정하면, 90% 이상의 확률로 우회에 성공할 것입니다.





# 함께 보면 좋은 글

댓글