CAPTCHA (аббревиатура расшифровывается как Completely Automated Public Turing test to tell Computers and Humans Apart) — это небольшие тесты или проверки, которые позволяют отличить человека от бота. Технически любой тип теста можно научиться обходить с помощью автоматизированных систем, но капча создана так, что применение компьютеров для её решения становится неоправданно дорогим и сложным.
Человек же такие проверки может проходить быстро и относительно легко. Например, когда нужно выбрать определённые типы изображений или распознать искажённые символы.
Капча была, есть и ещё долгое время будет оставаться эффективным механизмом защиты веб-сайтов и сервисов от ботов, парсеров и других нежелательных подключений.
Ниже расскажем о том, каких типов бывает капча, а также о том, как организовать обход reCAPTCHA и hCAPTCHA при парсинге – это наиболее популярные сервисы защиты, которые интегрируются с формами и страницами современных сайтов.
Типы CAPTCHA
Чтобы вы имели лучшее представление о механизмах защиты с помощью капчи, сначала расскажем каких видов она бывает:
- Классическая текстовая капча – это обычно искажённые буквы и цифры на картинке, которые нужно распознать пользователю. При достаточной «насмотренности» такую задачу уже умеют решать нейросети.
- Текст в цифры / примеры – это подвид текстовой капчи, где большие числа записаны словами. Пользователь читает слова, а в ответе указывает число. В некоторых случаях посетителя могут попросить решить простейший математический пример.
- reCAPTCHA v2 – устаревшая, но пока ещё в ходу, сводится к простановке галочки «Я не робот», но если алгоритм проверку не засчитывает, то он просит выбрать картинки, соответствующие определённым критериям.
- reCAPTCHA v3 – так называемая «невидимая капча», работает в фоне, оценивает поведение пользователя и почти незаметна для человека. Владелец сайта получает итоговую оценку посетителя и может настроить сложную логику реагирования. Например, сразу заблокировать или попросить решить графическую капчу на основе reCAPTCHA v2. Хотя в реальности это может быть любой другой механизм проверки на «человечность».
- Выбор картинок – этот механизм должен быть знаком многим: система показывает разные фрагменты изображений и просит выбрать те, которые подходят под обозначенные признаки. Например: выберите все картинки с машинами или со светофорами.
- Повернуть картинки – отдельная механика, где с помощью кнопок вращения нужно постараться повторить направление тех или иных объектов. Объекты для усложнения могут быть объёмными.
- Решить пазл – часть картинки нужно переместить на место с помощью специального ползунка или с помощью мыши / пальца (на сенсорных экранах).
- Расставить символы по порядку – сводится к тому, что человеку нужно распознать имеющиеся значки и символы на изображении, а затем прокликать на них в том порядке, который задан в отдельном образце.
- Аудио-капча – человек прослушивает буквы или цифры с помощью частично искажённого звука, а затем вводит их в специальной форме.
- Невидимые поля ввода (ловушки, Honeypot) – механизм защиты сводится к тому, что в HTML-коде встраивается ещё одна форма ввода, которая очень похожа на основную, но она скрывается с помощью JS-скрипта. Соответственно, реальный человек её не видит, поэтому не заполняет. Но если формой воспользуется бот, то он будет автоматически заблокирован. В этом алгоритме могут быть дополнительные усложнения, например, со случайными токенами для идентификации форм, предварительно заполненные значения и т.п.
- Анализ поведения – сейчас многие сайты имеют огромный объём JS-кода. Многие скрипты позволяют отслеживать действия посетителя: перемещение мыши, клики на кнопках и других элементах вёрстки, характер ввода текста в полях, задержки между скроллами, паузы между переходами по страницам и т.п. Если паттерн поведения не похож на естественные действия реального человека, то такое подключение блокируется.
Старая пословица гласит: каким бы умным ты себя ни считал, кто-то всегда будет на шаг впереди. Поэтому каждый механизм защиты можно обойти с помощью специальных технических решений – любую капчу можно скипнуть.
Что такое reCAPTCHA?

reCAPTCHA — это один из самых популярных облачных сервисов, который берёт на себя комплексную реализацию механизмов капчи. В настоящее время сервис принадлежит и развивается корпорацией Google.
Исходная версия скрипта была впервые представлена в 2007 году в Университете Карнеги – Меллона. А в 2009 году проект выкупила Google и интегрировала со своими сервисами: Blogger, YouTube, Gmail и пр. Приставка re- в названии не случайна. Она намекает на повторное использование, ведь фрагменты текста, которые предлагалось распознать пользователям, участвовали в обучении OCR-систем, которые в свою очередь оцифровывали книги.
Любой из сайтов может пользоваться сервисом reCAPTCHA, добавляя специальный скрипт на свои страницы или к формам, но стоит помнить, что Google взимает плату с проектов, которые совершают более 10 тыс. запросов капчи в месяц.
Первая версия reCAPTCHA выведена из строя в 2018 году, а вторая пока ещё остаётся в обиходе. Невидимая reCAPTCHA v3 была представлена в 2017 году, она оценивает посетителей по шкале от 0 до 1, где 0 – точно бот, а 1 – точно человек.
Благодаря reCAPTCHA Google может отслеживать поведение пользователей на сайтах, которые не принадлежат корпорации. С этим связано много споров и домыслов. Но факт остаётся фактом – reCAPTCHA является самой распространённой системой защиты от ботов во всём мире.
Как обойти reCAPTCHA при парсинге

Так как в ходу одновременно reCAPTCHA второй и третьей версии, могут применяться разные подходы и технические решения.
Ниже постараемся изложить наиболее дееспособные способы обхода reCAPTCHA.
1. Использование headless-браузера
И reCAPTCHA v2, и reCAPTCHA v3 работают с использованием JavaScript. Если вы будете подключаться к целевому сайту без полноценного браузера, то практически сразу получите блокировку. Исключение – если капчей защищены отдельные страницы или формы.
Так как Google анализирует большой объём данных о клиенте, нужно позаботиться о массе нюансов и настройках headless-браузера:
- Скрытие следов headless-режима. Например, могут подойти stealth-плагины, такие как puppeteer-extra-plugin-stealth, playwright-extra stealth и т.п. Но вместо этого можно попробовать скрывать признаки вручную – за счёт правильной настройки параметров запуска и специальных флагов.
- Имитация правдоподобного браузерного отпечатка. В это понятие входит много технических настроек – куки, набор шрифтов, юзер-агент, разрешение экрана, WebGL, canvas-отпечаток, параметры видеокарты/процессора и т.д.
- Имитация поведения реального пользователя. Для этого нужно правильно управлять задержками между переходами по URL-адресам, «шевелить» курсором, естественно скроллить страницы и т.п.
- Чёткий контроль за продолжительностью сессий и частотой обращений. Даже если поведение вашего виртуального пользователя будет идеальным, Google всё равно попросит решить капчу, если объём запросов с одного IP будет слишком большим.
Если использовать «чистый» браузерный профиль, то reCAPTCHA v3 или Enterprise сработает практически сразу. Обойти reCAPTCHA с помощью правильно настроенного браузера получится только на небольшом проценте сайтов – тех, что всё ещё используют вторую версию, а также там, где владельцы намеренно снизили порог срабатывания рекапчи третьего поколения.
2. Решение reCAPTCHA вручную
Логика до боли проста – вы запускаете парсер. Если в процессе его работы на странице показывается форма капчи, вы останавливаете скрипт и предлагаете решить капчу оператору.
После решения процесс сбора данных продолжается далее.
Однако, для этого нужно научить свой скрипт распознавать окно с капчей. Пример кода на Python:
import time
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
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
class RecaptchaParser:
def __init__(self, headless=True):
self.driver = None
self.headless = headless
self.setup_driver()
def setup_driver(self):
"""Chrome driver setup"""
chrome_options = Options()
if self.headless:
chrome_options.add_argument("--headless=new")
# Additional options for stability
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
# Masking as real user
chrome_options.add_argument(
"user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)
service = Service(ChromeDriverManager().install())
self.driver = webdriver.Chrome(service=service, options=chrome_options)
# Additional masking
self.driver.execute_script(
"Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
)
def check_recaptcha_v2(self):
"""Check for reCAPTCHA v2 appearance"""
try:
# Main reCAPTCHA v2 indicators
recaptcha_indicators = [
(By.CSS_SELECTOR, "iframe[src*='recaptcha']"),
(By.CSS_SELECTOR, "div.g-recaptcha"),
(By.CSS_SELECTOR, "iframe[title*='recaptcha']"),
(By.CSS_SELECTOR, "div.recaptcha-checkbox-border"),
(By.XPATH, "//div[contains(@class, 'recaptcha')]"),
]
for selector_type, selector in recaptcha_indicators:
try:
elements = self.driver.find_elements(selector_type, selector)
if elements:
return True
except:
continue
return False
except Exception as e:
print(f"Error checking reCAPTCHA v2: {e}")
return False
def check_recaptcha_v3(self):
"""Check for reCAPTCHA v3 presence"""
try:
# Check for reCAPTCHA v3 in page source
scripts = self.driver.find_elements(By.TAG_NAME, "script")
for script in scripts:
script_content = script.get_attribute('src') or script.get_attribute('innerHTML') or ''
if 'recaptcha' in script_content.lower() and 'api.js' in script_content:
# Additional check for v3
if 'render=explicit' not in script_content and 'render=onload' not in script_content:
return True
return False
except Exception as e:
print(f"Error checking reCAPTCHA v3: {e}")
return False
def check_recaptcha_challenge(self):
"""Check for captcha challenge window appearance"""
try:
# Check for various captcha interface elements
challenge_indicators = [
(By.CSS_SELECTOR, "iframe[src*='bframe']"), # Challenge frame
(By.CSS_SELECTOR, "div.rc-imageselect-desc"), # Challenge description
(By.CSS_SELECTOR, "div.rc-imageselect-target"), # Image selection area
(By.XPATH, "//div[contains(text(), 'Select all images')]"),
(By.XPATH, "//div[contains(text(), 'Please select all')]"),
]
for selector_type, selector in challenge_indicators:
try:
element = self.driver.find_element(selector_type, selector)
if element.is_displayed():
return True
except:
continue
return False
except Exception as e:
print(f"Error checking captcha challenge window: {e}")
return False
def wait_for_user_solution(self, timeout=300):
"""Wait for user to solve captcha"""
print("\n" + "="*50)
print("Captcha detected!")
print("Please solve the captcha in the opened browser window.")
print(f"You have {timeout//60} minutes.")
print("="*50 + "\n")
# Exit headless mode for captcha solving
if self.headless:
print("Switching to normal mode for captcha solving...")
self.headless = False
self.restart_driver_without_headless()
start_time = time.time()
while time.time() - start_time < timeout:
# Check if captcha disappeared
if not self.check_recaptcha_challenge() and not self.check_recaptcha_v2():
print("Captcha successfully solved! Continuing work...")
return True
# Show remaining time every 30 seconds
elapsed = int(time.time() - start_time)
if elapsed % 30 == 0:
remaining = timeout - elapsed
print(f"Waiting for captcha solution... {remaining} seconds remaining")
time.sleep(1)
print("Timeout waiting for captcha solution!")
return False
def restart_driver_without_headless(self):
"""Restart driver without headless mode"""
current_url = self.driver.current_url if self.driver else None
self.close()
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
service = Service(ChromeDriverManager().install())
self.driver = webdriver.Chrome(service=service, options=chrome_options)
if current_url:
self.driver.get(current_url)
def parse_with_recaptcha_handling(self, url, parse_function=None):
"""
Main method for parsing with captcha handling
:param url: URL to parse
:param parse_function: function for data parsing
"""
try:
print(f"Loading page: {url}")
self.driver.get(url)
# Main parsing loop
while True:
# Check for captcha presence
if self.check_recaptcha_v2() or self.check_recaptcha_v3():
print("Captcha detected on the page!")
if self.check_recaptcha_challenge():
# Captcha is already active
if not self.wait_for_user_solution():
print("Failed to solve captcha")
return None
else:
# Captcha is present but challenge window hasn't appeared yet
print("Waiting for captcha challenge window to appear...")
time.sleep(2)
# Try to activate captcha if needed
try:
recaptcha_iframe = self.driver.find_element(
By.CSS_SELECTOR,
"iframe[src*='recaptcha'], iframe[title*='recaptcha']"
)
self.driver.switch_to.frame(recaptcha_iframe)
# Click captcha checkbox
checkbox = self.driver.find_element(
By.CSS_SELECTOR,
".recaptcha-checkbox-border, #recaptcha-anchor"
)
checkbox.click()
self.driver.switch_to.default_content()
except:
pass
# Check if challenge window appeared
if self.check_recaptcha_challenge():
if not self.wait_for_user_solution():
print("Failed to solve captcha")
return None
# If no captcha, perform parsing
if parse_function:
result = parse_function(self.driver)
if result:
return result
# Short pause before next check
time.sleep(2)
except Exception as e:
print(f"Error during parsing process: {e}")
return None
def close(self):
"""Close browser"""
if self.driver:
self.driver.quit()
# Usage example
def example_parse_function(driver):
"""Example function for data parsing"""
try:
# Your parsing code here
# For example, get page title
title = driver.title
print(f"Current page title: {title}")
return title
except Exception as e:
print(f"Error during parsing: {e}")
return None
def main():
"""Main function"""
# Create parser instance
parser = RecaptchaParser(headless=True)
try:
# URL for parsing (example)
url = "https://www.google.com/recaptcha/api2/demo" # Test page with captcha
# Start parsing with captcha handling
result = parser.parse_with_recaptcha_handling(url, example_parse_function)
if result:
print(f"Parsing result: {result}")
else:
print("Failed to get data")
finally:
# Always close the browser
parser.close()
if __name__ == "__main__":
# Required libraries installation:
# pip install selenium webdriver-manager
main()
3. Работа через ротируемые резидентные или мобильные прокси
Если явных признаков бота нет, то системе безопасности, которая работает в паре с reCAPTCHA, нужно накопить больше информации о поведении и действиях пользователя. На это может уйти от 2 до 5 обращений к страницам целевого сайта.
Меняя IP-адреса, вы как бы сбрасываете этот счётчик, и системе безопасности нужно заново следить за вашей историей действий.
Единственный момент – IP-адреса должны быть максимально трастовыми. Именно к таким и относятся ротируемые мобильные и резидентные прокси.
При качественных прокси, которые меняются при каждом запросе, обойти reCAPTCHA будет нетрудно.
Обратите внимание! Подход с частой ротацией может быть применим не для всех ситуаций. Например, если вы авторизуетесь в аккаунте (личном кабинете, дашборде и т.п.), то логичнее удерживать сессию до последнего.
Тогда, если вам в конце концов покажется капча, нужно либо выждать больше времени, либо решить капчу вручную, либо сменить прокси. Но это желательно делать в паре с аккаунтом и браузерным профилем.
Где взять мобильные прокси?
Максимум гибкости и бесперебойная связь с мобильными IP-адресами от Froxy.
4. Использовать сервисы решения капчи
Чуть выше мы приводили код, помогающий обнаруживать окно с reCAPTCHA. Вместо решения вручную вы можете передать задачу профильным сервисам, таким как: CapSolver, Anti-Captcha, 2Captcha и пр.
Они либо привлекают ручной труд, либо имеют натренированные нейросети для решения, либо заранее прогревают headless-браузеры (это могут быть целые фермы, управляемые ИИ), либо комбинируют сразу несколько подходов в зависимости от типа и сложности капчи.
Если сайт защищается с помощью reCAPTCHA v3, то вам нужно добиться определённого порога оценки. Для этих целей может подойти только ферма с трастовыми экземплярами браузеров, как у CapSolver.
Примеры кода для отправки форм капчи и разбора ответов лучше посмотреть в документации профильных сервисов. Задача вашего скрипта – вовремя обнаружить запрос на решение капчи и подготовить ключ сайта.
Пример того, как может выглядеть sitekey в коде страницы, защищённой reCAPTCHA:
<div class="g-recaptcha" data-sitekey="6LdKlZEpAAAARRRQjzC2v_d36tWxCl6dWsozdSy9"></div>
В общем-то, все обозначенные подходы можно соединить в одну комплексную систему:
- Ваш парсер работает на базе headless-браузера.
- Следит за качеством браузерного профиля и за естественным поведением скрипта.
- Если объём парсинга небольшой, то решение капчи может предлагаться оператору локально.
- Если капчи слишком много, то тогда уже логично задействовать платные внешние сервисы.
Что такое hCaptcha

hCaptcha (сокращение от human Captcha) – это одна из немногочисленных качественных альтернатив Google reCAPTCHA. В отличие от корпорации Google, владельцы hCaptcha не анализируют поведение пользователей в целях продвижения своих смежных продуктов. Наоборот, разработчик, компания Intuition Machines, специализируется на приватности.
hCaptcha предлагает несколько режимов, аналогично reCAPTCHA:
- Видимая капча (классика) – галочка + картинки.
- Невидимая (passive) – почти ничего не видно, только маленький бейджик в углу страницы. Скрипт анализа работает в фоне.
- Без капчи (frictionless) – полностью невидимая капча, только поведенческая аналитика + ИИ-оценка риска.
- Enterprise – кастомные режимы + API. Полный стек для автоматизации, который будет полезен крупным клиентам и корпорациям.
Что примечательно: владельцы сайтов, подключённых к hCaptcha, могут дополнительно зарабатывать, когда пользователи решают задачи с капчей. Intuition Machines продаёт размеченные данные для обучения ИИ и делится доходом с сайтами.
Переход с reCAPTCHA возможен буквально после редактирования пары строк кода. Достаточно изменить адрес подключения скрипта и отдельные поля.
Как обойти hCaptcha при парсинге

Методы обхода hCaptcha во многом аналогичны тому, что мы привели для reCAPTCHA:
- Headless-браузер с естественным браузерным профилем и поведением.
- Решение капчи вручную или с помощью внешних сервисов.
- Работа через качественные ротируемые прокси с «человеческими» IP-адресами (мобильные или домашние ПК).
Уникальными будут только признаки, по которым можно обнаружить hCaptcha:
<div class="h-captcha" data-sitekey="..."><script src="https://js.hcaptcha.com/1/api.js...">- iframe с hcaptcha.com в src
- Сетевые запросы к домену hcaptcha.com.
Заключение
Итак, даже если мы будем рассматривать любые другие альтернативные сервисы капчи, такие как Turnstile от Cloudflare, Yandex SmartCaptcha, MTCaptcha, Puzzle CAPTCHA, FunCaptcha и прочие, в них будут использоваться аналогичные механики – почти все они перешли на JavaScript и отслеживание активности в фоне. Поэтому для работы с ними нужны полноценные браузеры, прогретые профили и имитация человеческого поведения. Если капча всё равно показывается, её либо нужно решать вручную, либо через специальные платные сервисы.
Быстрый и недорогой вариант борьбы с reCAPTCHA, hCaptcha и аналогами – качественные ротируемые прокси, которые позволяют менять IP-адреса хоть при каждом новом запросе. Как раз к таким и относятся прокси Froxy. У нас свыше 10 млн. IP в пуле, ротация и таргетинг гибко настраиваются под клиента, в ассортименте резидентные, мобильные и серверные прокси.

