CAPTCHA (аббревиатура расшифровывается как Completely Automated Public Turing test to tell Computers and Humans Apart) — это небольшие тесты или проверки, которые позволяют отличить человека от бота. Технически любой тип теста можно научиться обходить с помощью автоматизированных систем, но капча создана так, что применение компьютеров для её решения становится неоправданно дорогим и сложным.
Человек же такие проверки может проходить быстро и относительно легко. Например, когда нужно выбрать определённые типы изображений или распознать искажённые символы.
Капча была, есть и ещё долгое время будет оставаться эффективным механизмом защиты веб-сайтов и сервисов от ботов, парсеров и других нежелательных подключений.
Ниже расскажем о том, каких типов бывает капча, а также о том, как организовать обход reCAPTCHA и hCAPTCHA при парсинге – это наиболее популярные сервисы защиты, которые интегрируются с формами и страницами современных сайтов.
Чтобы вы имели лучшее представление о механизмах защиты с помощью капчи, сначала расскажем каких видов она бывает:
Старая пословица гласит: каким бы умным ты себя ни считал, кто-то всегда будет на шаг впереди. Поэтому каждый механизм защиты можно обойти с помощью специальных технических решений – любую капчу можно скипнуть.
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 v2, и reCAPTCHA v3 работают с использованием JavaScript. Если вы будете подключаться к целевому сайту без полноценного браузера, то практически сразу получите блокировку. Исключение – если капчей защищены отдельные страницы или формы.
Так как Google анализирует большой объём данных о клиенте, нужно позаботиться о массе нюансов и настройках headless-браузера:
Если использовать «чистый» браузерный профиль, то reCAPTCHA v3 или Enterprise сработает практически сразу. Обойти 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()
Если явных признаков бота нет, то системе безопасности, которая работает в паре с reCAPTCHA, нужно накопить больше информации о поведении и действиях пользователя. На это может уйти от 2 до 5 обращений к страницам целевого сайта.
Меняя IP-адреса, вы как бы сбрасываете этот счётчик, и системе безопасности нужно заново следить за вашей историей действий.
Единственный момент – IP-адреса должны быть максимально трастовыми. Именно к таким и относятся ротируемые мобильные и резидентные прокси.
При качественных прокси, которые меняются при каждом запросе, обойти reCAPTCHA будет нетрудно.
Обратите внимание! Подход с частой ротацией может быть применим не для всех ситуаций. Например, если вы авторизуетесь в аккаунте (личном кабинете, дашборде и т.п.), то логичнее удерживать сессию до последнего.
Тогда, если вам в конце концов покажется капча, нужно либо выждать больше времени, либо решить капчу вручную, либо сменить прокси. Но это желательно делать в паре с аккаунтом и браузерным профилем.
Максимум гибкости и бесперебойная связь с мобильными IP-адресами от Froxy.
Чуть выше мы приводили код, помогающий обнаруживать окно с reCAPTCHA. Вместо решения вручную вы можете передать задачу профильным сервисам, таким как: CapSolver, Anti-Captcha, 2Captcha и пр.
Они либо привлекают ручной труд, либо имеют натренированные нейросети для решения, либо заранее прогревают headless-браузеры (это могут быть целые фермы, управляемые ИИ), либо комбинируют сразу несколько подходов в зависимости от типа и сложности капчи.
Если сайт защищается с помощью reCAPTCHA v3, то вам нужно добиться определённого порога оценки. Для этих целей может подойти только ферма с трастовыми экземплярами браузеров, как у CapSolver.
Примеры кода для отправки форм капчи и разбора ответов лучше посмотреть в документации профильных сервисов. Задача вашего скрипта – вовремя обнаружить запрос на решение капчи и подготовить ключ сайта.
Пример того, как может выглядеть sitekey в коде страницы, защищённой reCAPTCHA:
<div class="g-recaptcha" data-sitekey="6LdKlZEpAAAARRRQjzC2v_d36tWxCl6dWsozdSy9"></div>
В общем-то, все обозначенные подходы можно соединить в одну комплексную систему:
hCaptcha (сокращение от human Captcha) – это одна из немногочисленных качественных альтернатив Google reCAPTCHA. В отличие от корпорации Google, владельцы hCaptcha не анализируют поведение пользователей в целях продвижения своих смежных продуктов. Наоборот, разработчик, компания Intuition Machines, специализируется на приватности.
hCaptcha предлагает несколько режимов, аналогично reCAPTCHA:
Что примечательно: владельцы сайтов, подключённых к hCaptcha, могут дополнительно зарабатывать, когда пользователи решают задачи с капчей. Intuition Machines продаёт размеченные данные для обучения ИИ и делится доходом с сайтами.
Переход с reCAPTCHA возможен буквально после редактирования пары строк кода. Достаточно изменить адрес подключения скрипта и отдельные поля.
Методы обхода hCaptcha во многом аналогичны тому, что мы привели для reCAPTCHA:
Уникальными будут только признаки, по которым можно обнаружить hCaptcha:
<div class="h-captcha" data-sitekey="..."><script src="https://js.hcaptcha.com/1/api.js...">Итак, даже если мы будем рассматривать любые другие альтернативные сервисы капчи, такие как Turnstile от Cloudflare, Yandex SmartCaptcha, MTCaptcha, Puzzle CAPTCHA, FunCaptcha и прочие, в них будут использоваться аналогичные механики – почти все они перешли на JavaScript и отслеживание активности в фоне. Поэтому для работы с ними нужны полноценные браузеры, прогретые профили и имитация человеческого поведения. Если капча всё равно показывается, её либо нужно решать вручную, либо через специальные платные сервисы.
Быстрый и недорогой вариант борьбы с reCAPTCHA, hCaptcha и аналогами – качественные ротируемые прокси, которые позволяют менять IP-адреса хоть при каждом новом запросе. Как раз к таким и относятся прокси Froxy. У нас свыше 10 млн. IP в пуле, ротация и таргетинг гибко настраиваются под клиента, в ассортименте резидентные, мобильные и серверные прокси.