웹 자동화를 위해 Selenium을 사용할 때, 많은 웹사이트들이 Selenium을 사용하는 브라우저를 탐지하고 차단하는 것을 경험한 적이 있을 것입니다. 특히, Cloudflare와 같은 보안 서비스는 자동화된 요청을 감지하고 CAPTCHA를 띄우거나 접근을 차단하는 경우가 많습니다.
이 문제를 해결하는 방법 중 하나가 바로 --disable-blink-features=AutomationControlled 옵션을 사용하는 것입니다. 이번 포스팅에서는 이 옵션이 무엇이며, 어떻게 동작하는지 그리고 Selenium 탐지를 어떻게 우회할 수 있는지에 대해 자세히 알아보겠습니다. 또한 실제로 적용했던 부분을 보여드리겠습니다.
1. AutomationControlled란 무엇인가?
먼저, AutomationControlled는 Chrome 브라우저에서 자동화 탐지를 위한 내부적인 기능입니다. 크롬 브라우저는 Selenium과 같은 자동화 도구가 실행될 때, 개발자 도구에서 navigator.webdriver 속성을 통해 이를 감지할 수 있도록 설정합니다.
console.log(navigator.webdriver); // true (Selenium이 실행 중일 때)
웹사이트는 이 속성을 확인하여 사용자가 Selenium을 사용하고 있는지 탐지할 수 있습니다. 예를 들어, Cloudflare는 자동화된 브라우저를 탐지하면 CAPTCHA를 띄우거나, 페이지 로딩을 차단합니다.
핵심 포인트:
navigator.webdriver 값이 true면 웹사이트는 해당 브라우저가 Selenium을 사용하고 있음을 감지할 수 있음
기본적으로 Chrome은 자동화된 환경에서 이 값을 true로 설정함
2. 역할
--disable-blink-features=AutomationControlled 옵션은 크롬 브라우저에서 자동화 탐지를 담당하는 AutomationControlled 기능을 비활성화하는 역할을 합니다. 이를 사용하면 다음과 같은 효과가 있습니다:
navigator.webdriver 속성이 false로 변경됨
Selenium이 실행 중인 크롬 브라우저를 일반 사용자 브라우저처럼 보이게 만듦
Cloudflare 및 기타 탐지 시스템을 우회할 확률이 높아짐
옵션 적용 방법:
from selenium import webdriver
import undetected_chromedriver as uc
options = uc.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
browser = uc.Chrome(options=options)
browser.get("https://example.com")
위와 같이 설정하면 브라우저가 자동화 탐지를 비활성화한 상태로 실행되며, navigator.webdriver 속성이 false로 유지됩니다.
console.log(navigator.webdriver); // false (탐지 우회 성공!)
💡 핵심 포인트:
- --disable-blink-features=AutomationControlled를 사용하면 Chrome이 자동화 여부를 노출하지 않도록 설정됨
- Cloudflare와 같은 보안 시스템이 Selenium을 탐지하는 주요 수단을 무력화함
이는 우회 방법중 하나 입니다. 이 옵션만을 적용해서 무조건 우회가 되는 것은 아닙니다.
제가 직접 해본 결과 매우 다양한 모델들을 사용해서 우회를 적용해도 안될 수 있었습니다.
아래 코드는 Cloudflare의 탐지를 우회하기 위해 했던 코드입니다. 저는 이 코드에 모델을 추가하거나 제거 했을 때 모두 Cloudflare가 탐지했습니다. 이를 우회하기 위해서는 적절한 우회 계획을 세우고 최대한 사람 처럼 행동을 하거나 접속 자체를 우회하는 방법을 사용했습니다. 이 카테고리에서 이 코드에 사용된 모든 우회방법들을 제가 직접 써칭하여 쉽고 자세하게 설명 드리겠습니다.
from selenium import webdriver
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from IPython.display import display, clear_output
from tqdm import tqdm
import time
import random
def random_sleep(min_time=2, max_time=4):
time.sleep(random.uniform(min_time, max_time))
def print_status(message):
"""Display status and clear previous output"""
clear_output(wait=True)
print(message)
def show_progress_bar(duration, description):
"""Show a progress bar for the specified duration"""
for _ in tqdm(range(duration), desc=description, unit="s"):
time.sleep(1)
options = uc.ChromeOptions()
options.add_argument('--headless=new')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--window-size=1920,1080')
options.add_argument('--start-maximized')
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
options.add_argument('--enable-javascript')
options.add_argument('--disable-notifications')
options.add_argument("--lang=ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7")
caps = {
'goog:loggingPrefs': {'performance': 'ALL'}
}
driver = uc.Chrome(
options=options,
headless=True,
use_subprocess=True,
desired_capabilities=caps
)
try:
#|||||||||||||||||| SECRET
#댓글로 요청하시면 파일 원본 보내드리겠습니다.
except Exception as e:
print_status(f"Error occurred: {e}")
try:
driver.save_screenshot("error_screenshot.png")
print_status("Error screenshot saved.")
except:
print_status("Failed to save error screenshot.")
finally:
driver.quit()
'Bypassing Cloudflare' 카테고리의 다른 글
User-Agent | --lang (1) | 2025.02.18 |
---|