Урок 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.
