Вход Регистрация

Парсинг

reCAPTCHA и hCaptcha: гайд для скрапинга

Действенный вариант борьбы с reCAPTCHA, hCaptcha и аналогами – качественные ротируемые прокси со сменой IP-адреса хоть при каждом новом запросе.

Команда Froxy 17 мар 2026 8 мин
reCAPTCHA и hCaptcha: гайд для скрапинга

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?

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 второй и третьей версии, могут применяться разные подходы и технические решения.

Ниже постараемся изложить наиболее дееспособные способы обхода 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

hCaptcha (сокращение от human Captcha) – это одна из немногочисленных качественных альтернатив Google reCAPTCHA. В отличие от корпорации Google, владельцы hCaptcha не анализируют поведение пользователей в целях продвижения своих смежных продуктов. Наоборот, разработчик, компания Intuition Machines, специализируется на приватности.

hCaptcha предлагает несколько режимов, аналогично reCAPTCHA:

  • Видимая капча (классика) – галочка + картинки.
  • Невидимая (passive) – почти ничего не видно, только маленький бейджик в углу страницы. Скрипт анализа работает в фоне.
  • Без капчи (frictionless) – полностью невидимая капча, только поведенческая аналитика + ИИ-оценка риска.
  • Enterprise – кастомные режимы + API. Полный стек для автоматизации, который будет полезен крупным клиентам и корпорациям.

Что примечательно: владельцы сайтов, подключённых к hCaptcha, могут дополнительно зарабатывать, когда пользователи решают задачи с капчей. Intuition Machines продаёт размеченные данные для обучения ИИ и делится доходом с сайтами.

Переход с reCAPTCHA возможен буквально после редактирования пары строк кода. Достаточно изменить адрес подключения скрипта и отдельные поля.

Как обойти hCaptcha при парсинге

Как обойти hCaptcha при парсинге

Методы обхода hCaptcha во многом аналогичны тому, что мы привели для reCAPTCHA:

  1. Headless-браузер с естественным браузерным профилем и поведением.
  2. Решение капчи вручную или с помощью внешних сервисов.
  3. Работа через качественные ротируемые прокси с «человеческими» 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 в пуле, ротация и таргетинг гибко настраиваются под клиента, в ассортименте резидентные, мобильные и серверные прокси.

Получайте уведомления о новых функциях и обновлениях Froxy

Узнайте первыми о новых функциях Froxy, чтобы оставаться в курсе событий происходящих на рынке цифровых технологий и получать новости о новых функциях Froxy.

Статьи по Теме

Веб-скрапинг Airbnb: руководство с основными нюансами

Парсинг

Веб-скрапинг Airbnb: руководство с основными нюансами

Вы когда-нибудь хотели быстро и автоматически собирать данные Airbnb о местах проживания и их ценах? Если да, то мы расскажем вам все подробности...

Команда Froxy 25 дек 2025 7 мин
Скрапинг сложных JavaScript-сайтов без API: хитрости работы с динамическим контентом

Парсинг

Скрапинг сложных JavaScript-сайтов без API: хитрости работы с динамическим контентом

Узнайте, как собирать данные с JavaScript-сайтов, когда нет API. Приемы и инструменты для скрапинга и работы с динамическим контентом через Python.

Команда Froxy 13 ноя 2025 8 мин