Урок 25. Работа с CAPTCHA и антибот-защитой (теория) в Selenium

CAPTCHA и антибот-защита — это механизмы сайтов, которые предотвращают автоматическое взаимодействие и защиту от спама или злоумышленников. В Selenium важно понимать, как работать с такими элементами и минимизировать вероятность блокировок.

Что такое CAPTCHA

CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) — это тест, который отличает человека от бота. Веб-сайты используют разные виды CAPTCHA:

  • Текстовая CAPTCHA — ввод символов с изображения.
  • reCAPTCHA v2 — отметка «Я не робот» с проверкой поведения пользователя.
  • reCAPTCHA v3 — невидимая система, оценивающая риск взаимодействия с сайтом.
  • Графические задачи — выбор картинок по определенному признаку.

Основные подходы к работе с CAPTCHA

Полностью обойти CAPTCHA автоматическими средствами нельзя без специальных сервисов. Но есть безопасные и легальные методы минимизации проблем:

  • Паузы и имитация поведения человека: делайте случайные задержки между действиями, имитируйте движение мыши и скроллинг.
  • Использование прокси и ротация IP: уменьшает риск блокировки по IP при массовых запросах.
  • Обход через сервисы распознавания: платные сервисы (2Captcha, Anti-Captcha) могут помочь решать текстовые и графические CAPTCHA.
  • Взаимодействие с видимыми элементами: иногда CAPTCHA можно обойти, используя Selenium для навигации и частичного взаимодействия без прямого ввода символов.

Практические рекомендации

  • Старайтесь минимизировать количество запросов к сайту за короткое время.
  • Для тестирования используйте отдельные аккаунты и прокси.
  • Имейте резервный план, если CAPTCHA не удается пройти автоматически — вручную или через сервисы распознавания.
  • Следите за обновлениями CAPTCHA на сайтах, так как они часто меняются.

Пример безопасной стратегии в Selenium

Вы можете комбинировать имитацию человеческого поведения с проверкой наличия CAPTCHA на странице:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import random

driver = webdriver.Chrome()
driver.get("https://parsertools.ru")

# Имитация скроллинга
driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);")
time.sleep(random.uniform(1.5, 3.0)) # приостанавливает выполнение программы на случайное время от 1.5 до 3 секунд

# Проверка наличия CAPTCHA
try:
    captcha = driver.find_element(By.CLASS_NAME, "captcha-container")
    print("CAPTCHA обнаружена. Требуется ручное решение или сервис распознавания.")
except:
    print("CAPTCHA не обнаружена, можно продолжать автоматизацию.")
time.sleep(10)
driver.quit()

Пример: скрипт открывает демонстрационную страницу reCAPTCHA, обнаруживает капчу и ждёт, пока вы вручную решите её в окне браузера (подходит для тестирования и CI с человеческим участием).
Скрипт не пытается взламывать капчу — он только детектирует и ожидает решения.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# URL с демонстрацией reCAPTCHA (реальный сайт для тестов)
URL = "https://www.google.com/recaptcha/api2/demo"

# Настройка драйвера
driver = webdriver.Chrome()
driver.maximize_window()
wait = WebDriverWait(driver, 15)

try:
    # Открываем страницу
    driver.get(URL)

    # Ждём появления iframe reCAPTCHA на странице
    captcha_iframe = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "iframe[title^='reCAPTCHA']"))
    )
    print("CAPTCHA iframe найден. Пожалуйста, решите CAPTCHA вручную в открывшемся окне браузера.")

    # Переключаемся в iframe и находим чекбокс (recaptcha-anchor)
    driver.switch_to.frame(captcha_iframe)
    try:
        anchor = wait.until(EC.presence_of_element_located((By.ID, "recaptcha-anchor")))
    except Exception:
        # Иногда видим iframe другого типа (виджет в invisible режиме) — просто вернёмся и будем опрашивать
        anchor = None
    finally:
        # Возвращаемся в основной документ (нам нужно проверять состояние)
        driver.switch_to.default_content()

    # Ожидаем, пока капча будет решена (polling)
    # Подход: периодически проверяем атрибут aria-checked у элемента внутри iframe
    solved = False
    timeout_seconds = 120  # время ожидания решения капчи (измените при необходимости)
    polling_interval = 2
    elapsed = 0

    while elapsed < timeout_seconds:
        try:
            # Найдём iframe снова (он может быть пересоздан)
            iframe = driver.find_element(By.CSS_SELECTOR, "iframe[title^='reCAPTCHA']")
            driver.switch_to.frame(iframe)

            # Попытаемся получить состояние чекбокса
            anchor_el = driver.find_element(By.ID, "recaptcha-anchor")
            aria_checked = anchor_el.get_attribute("aria-checked")
            driver.switch_to.default_content()

            if aria_checked == "true":
                solved = True
                print("CAPTCHA решена.")
                break
        except Exception:
            # Ошибки игнорируем — будем пробовать снова
            driver.switch_to.default_content()

        time.sleep(polling_interval)
        elapsed += polling_interval

    if not solved:
        print(f"CAPTCHA не решена за {timeout_seconds} секунд. Прервано.")

    # Дальше можно продолжать автоматизацию, если CAPTCHA решена
    if solved:
        # пример: перейти на страницу с формой (или выполнить дальнейшие действия)
        print("Далее выполняем оставшиеся действия...")

finally:
    # даём пару секунд посмотреть результат, затем закрываем
    time.sleep(2)
    driver.quit()

Короткие замечания и рекомендации:

Скрипт использует реальный тестовый URL https://www.google.com/recaptcha/api2/demo
Это безопасная и правомерная стратегия для автоматизации тестов: детектировать капчу и передавать её человеку или внешнему сервису (если используете платные сервисы распознавания — интегрируйте их API отдельно и соблюдайте правила сайта).
Для массовой автоматизации лучше избегать обхода CAPTCHA — используйте тестовые окружения или договорённости с владельцами сайтов.

В этом уроке вы узнали, что такое CAPTCHA, какие существуют виды защиты от ботов и как безопасно работать с ними в Selenium. Это знание важно для планирования стратегии автоматизации и минимизации блокировок при парсинге или тестировании.

Больше уроков по парсингу на parsertools.ru/lessons.