Обход капчи продвинутым способом — рекомендации для SEO-специалистов с примерами кода

Обход капчи в SEO: что это и не преувеличено ли значение?  

Любой профессионал в SEO сталкивался с капчей —, а если нет, то он либо не профессионал, либо некорректно понимает абревиатуру SEO (может путает ее с SMM или СЕО) либо только начал заниматься этим нелегким делом.

CAPTCHA (правильное написание — заглавными) расшифровывается как «Completely Automated Public Turing Test To Tell Computers and Humans Apart». По-русски это «Полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей».

Можно долго отрицать и доказывать с пеной у рта, что CAPTCHA переоценена и не нужно тратить на нее значительные ресурсы. Но все эти доказывания заканчиваются ровно в тот момент, когда появляется задача получить данные из поисковой выдачи, например Яндекс, а ты понятия не имеешь что такое XML запросы… Или, например. клиент хочет спарсить весь Амазон (ну вот хочет он и все тут) и платит хорошо… 

Когда клиент платит хорошо:

Когда клиент платит хорошо: «Ни слова больше…»

Короче говоря — может не пригодиться, но лучше быть готовым если вдруг. Это даже не похоже не подготовку к апокалипсису, я бы сравнил это с заменой резины с летней на зимнюю на Юге. В теории, на Юге зимой всегда плюсовая температура и если подумать, то можно резину не менять. А в те пару дней, когда вдруг выпадет снег, можно просто переждать дома. Но вдруг тебе захочется поехать за пределы региона? А резина летняя… Так и со знаниями о том, как можно обходить капчу. Никогда не знаешь когда понадобиться.

Мы не можем избежать капчи, но можем подготовиться к обходу.

Мы не можем избежать капчи, но можем подготовиться к обходу.

Почему капча используется, несмотря на доступные методы обхода?

На самом деле ситуация не так однозначна, как может показаться. Защитить сайт от парсинга данных может быть сложно, особенно, если это некоммерческий проект, а какой-то сайт-хомячок. Времени и самое главное, желания, тратить ресурсы на непонятную капчу не хочется. Другое дело, если ты владелец крупного портала и этот портал приносит тебе многомиллионную прибыль. Согласитесь, есть повод задуматься о полноценной защите. В конце концов, даже банальная защита от нечистых на руку конкурентов, которые могут начать вас ddosить.

b8710d55716ade87089124a7e43b6517.jpg

Взять к примеру Amazon — эти ребята знают толк в извращениях  способах защиты. Помимо того, что на сайте Amazon есть три вида капчи, каждая из которых появляется в разных случаях, так они еще рандомно меняют дизайн, чтобы автоматизаторы и парсеры не могли выполнять свои действия старыми методами. Меняется дизайн — меняется и скрипт (и судя по числу желающих спарсить весь Амазон не один скрипт, а сотни или тысячи), такой вот круговорот.

Амазон и его защита от ботов

Амазон и его защита от ботов

С Amazon понятно, они защищают свою инфраструктуру, а с более мелкими вебмастерами тогда что? Вебмастера тоже неглупые люди и понимают, что ставя на сайт труднопроходимую капчу, они тем самым создают дополнительные сложности для своих реальных посетителей, чем сложнее капча, тем больше шансов, что пользователь просто уйдет к конкуренту по поисковой выдаче. Поэтому современные владельцы сайтов пытаются не жестить с капчей, и стараются соблюсти баланс.

Совсем оставить сайт без защиты глупо — так как туда начнут ломиться совсем уж туповатые боты, которые не умеют обходить капчу, но умеют совершать массовые действия, поэтому выбирают какие-то универсальные решения, типа reCAPTCHA или hCaptcha. И долг выполнен (в смысле, сайт под защитой) и пользователи не сильно напрягаются.

Уровень защиты сайта: Приемлемо

Уровень защиты сайта: Приемлемо

К более сложным капчам прибегают тогда, когда на сайте начинают нагуливать ботов, но это уже тема отдельной статьи. 

415233e068cdc959ae0521a61a725a7e.jpg

Таким образом, совсем оставить сайт без защиты — это моветон, а использовать нечто среднее вполне допустимо. Тех кто нацелен на контент это не остановит, но, как минимум отпугнет совсем уж тупых ботов.

Зачем SEO-специалисту обход капчи?  

Теперь рассмотрим вопрос с точки зрения SEO-специалиста: зачем и для чего ему обходить капчу?

  1. Обход капчи может понадобиться при решении самой банальной задачи — анализе позиций в поисковых системах. Да, это все реализовано в сторонних сервисах, которые берут деньги за ежедневный мониторинг этих позиций, и помимо того, что вы платите сервису, вам нужно еще и платить стороннему сервису распознавания капчи.

  2. При исследовании сайтов конкурентов капча менее актуальна, так как обоход капчи на сайте легче, чем при сборе позиций (уровни немного различаются).

  3. Для автоматизации рутинных задач — это совсем нишевая история. не все ее используют, но для вовлеченных SEOшников может быть полезно.

В общем, важно посчитать экономику — что дешевле, платить сервису мониторинга позиций и дополнительно сервису распознавания капчи или сделать свое решение и сократить траты. Конечно, если проект 1–2, второй вариант звучит геморойно, если за все платит клиент, тоже нет смысла считать экономику, но если ты владелец нескольких проектов и за все платишь сам… Надо думать…

В большинстве случаев SEO-специалисты прибегают к обходу капчи при работе с Google или Яндекс, используя готовые решения вроде сервисов распознавания капчи или API-ключей. Но есть и такие спецы, кто не привык отдавать все на аутсорс и вот у них есть собственные решения для рутинных задач.

408b1b1132b77d1acdaf270b8dc3204d.jpg

Основные методы обхода капчи 

Рассмотрим способы, требующие немного больше усилий, чем простое подключение API ключа в Кей Коллектор. Но стоит обратить внимание, что тут потребуются чуть более глубокие знания, чем умение находить ключ АПИ на главной странице сервиса и вставлять его в нужное поле.

Капча меняет дизайн, мы меняем скрипт. И так бесконечно.

Капча меняет дизайн, мы меняем скрипт. И так бесконечно.

Сторонние сервисы распознавания капчи

Самый популярный способ — отправка капчи на специализированный сервис (2captcha, ruCaptcha и др.), который возвращает готовое решение. Эти сервисы требуют оплаты только за решенные капчи. 

Все можно автоматизировать, я это понял благодаря многодневной борьбой с той или иной задачей. К примеру — надо найти на странице sitekey, однократно это не проблема, но при многопотоке, это нереально. И код начинает раздуваться — пишется модуль для поиска нужного параметра на странице.

Идем дальше, нашли параметр, отправили его на сторонний сервис, получили результат. Но с результатом тоже надо что то делать… Подставить его в нужное поле… Снова расширяем код. 

Так что приведенный ниже код не решает вашу задачу по щелчку пальцев — от вас потребуются определенные действия, как минимум, те что я описал выше. 

Пример стандартного (универсального) кода для решения reCaptcha V2 на Python:

import requests
import time

API_KEY = 'ВАШ_КЛЮЧ_2CAPTCHA'
SITE_KEY = 'ВАШ_SITE_KEY'
PAGE_URL = 'https://example.com'

def get_captcha_solution():
    captcha_id_response = requests.post("http://2captcha.com/in.php", data={
        'key': API_KEY,
        'method': 'userrecaptcha',
        'googlekey': SITE_KEY,
        'pageurl': PAGE_URL,
        'json': 1
    }).json()

    if captcha_id_response['status'] != 1:
        print(f"Ошибка: {captcha_id_response['request']}")
        return None

    captcha_id = captcha_id_response['request']
    print(f"Капча отправлена. ID: {captcha_id}")

    for attempt in range(30):
        time.sleep(5)
        result = requests.get("http://2captcha.com/res.php", params={
            'key': API_KEY,
            'action': 'get',
            'id': captcha_id,
            'json': 1
        }).json()

        if result['status'] == 1:
            print(f"Капча решена: {result['request']}")
            return result['request']
        elif result['request'] == 'CAPCHA_NOT_READY':
            print(f"Ожидание решения... попытка {attempt + 1}/30")
        else:
            print(f"Ошибка: {result['request']}")
            return None
    return None

captcha_solution = get_captcha_solution()

if captcha_solution:
    print('Решение капчи:', captcha_solution)
else:
    print('Решение не удалось.')

Я в 3 часа ночи: 'Всего одна строчка кода, и капча будет обходиться автоматически.

Я в 3 часа ночи: 'Всего одна строчка кода, и капча будет обходиться автоматически.

В данном примере необходимо найти на странице один параметр (в коде он называется  SITE_KEY), а на странице с капчей, как правило указан «sitekey». Этот параметр вместе с URL капчи и ключем АПИ от сервиса 2captcha отправляется на сервер, а после получения токена от решенной капчи необходимо его (токен) подставить в капчу. 

Дальше можно продолжать приостановленные из-за капчи действия. 

В любой капче, которая решается токеном код будет примерно таким же, отличие в наборе передаваемых параметров, а в некоторых (типа Амазон капчи) добавляется еще и максимальное время решения.

Достоинства - простота настройки, скорость распознавания

Недостатки - метод платный, так как используется сторонний сервис

Обход капчи с использованием прокси и ротации IP-адресов

Второй вариант обойти капчу для решения SEO задач основывается на использовании большого количества прокси, которые через определенное время, либо при появлении капчи, или ошибки на стороне ресурса, к которому обращаемся, меняются.

Используя ротацию прокси, мы обращаемся к источнику парсинга с каждым новым прокси, как новая личность и источник не считает наши действия подозрительными (какое-то время).

Для реализации метода потребуется пул ip адресов (что может быть не сильно дешевле, а иногда даже дороже чем метод с обходом капчи через сторонний сервис). Можно использовать резидентные прокси с ротацией, тогда не нужен пул ip адресов, достаточно будет правильно настроить ротации, либо — можно использовать мобильные прокси, они будут дороже резидентных, но и качество таких проксей кратно выше. В общем, на любой бюджет и требования есть свое решение.

Вот пример кода, который не будет работать автономно, а только если его встроить в ваш скрипт (программу)

import requests
from itertools import cycle
import time
import urllib.parse

# Список прокси с индивидуальными логинами и паролями
proxies_list = [
    {"proxy": "2captcha_proxy_1:port", "username": "user1", "password": "pass1"},
    {"proxy": "2captcha_proxy_2:port", "username": "user2", "password": "pass2"},
    {"proxy": "2captcha_proxy_3:port", "username": "user3", "password": "pass3"},
    {"proxy": "2captcha_proxy_4:port", "username": "user4", "password": "pass4"},
    # Добавьте остальные прокси по аналогии
]

# Цикл прокси для ротации
proxy_pool = cycle(proxies_list)

# Целевой URL, с которым работаем
url = "https://example.com"  # Замените на нужный сайт

# Заголовки для имитации реального пользователя
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0"
}

# Отправляем несколько запросов с ротацией прокси
for i in range(5):  # Укажите нужное количество запросов
    proxy_info = next(proxy_pool)  # Выбираем следующий прокси
    proxy = proxy_info["proxy"]
    username = urllib.parse.quote(proxy_info["username"])
    password = urllib.parse.quote(proxy_info["password"])

    # Формируем прокси с авторизацией
    proxy_with_auth = f"http://{username}:{password}@{proxy}"

    try:
        response = requests.get(
            url,
            headers=headers,
            proxies={"http": proxy_with_auth, "https": proxy_with_auth},
            timeout=10
        )
        
        # Проверка статуса ответа
        if response.status_code == 200:
            print(f"Запрос {i + 1} через прокси {proxy} успешен. Статус: {response.status_code}")
        else:
            print(f"Запрос {i + 1} через прокси {proxy} завершился с кодом {response.status_code}")
    
    except requests.exceptions.RequestException as e:
        print(f"Ошибка на прокси {proxy}: {e}")
    
    # Задержка между запросами для естественного поведения
    time.sleep(2)  # Настройте задержку в зависимости от требований

В коде приведены примеры для использования резидентных прокси 2captcha.

Хороший пример — сервис Linkedin, у них настроена система таким образом, что три раза с одного ip адреса можно авторизоваться без ввода капчи, а на третий раз вылезает капча, таким образом, зная такую особенность настраиваем ротацию прокси и радуемся, что взломали систему… Пока не пофиксят, конечно.)

Плюсы — решение не требует интеграции сторонних сервисов, если у вас есть собственный пул ip адресов

Минусы — решение нестабильное по сравнению с первым способом, а при использовании качественных прокси может быть дороже чем обход капчи.

Обход капчи с использованием Headless-браузеров

Конечно, использование одной лишь ротации прокси без дополнительных вводных будет недостаточно, так как предотвратить появление капчи в современных условиях простой сменой ip адресов будет недостаточно, поэтому третий метод плавно вытекает из второго и объединяет их.

e8631d1c99025adf9d1779f43a741732.jpg

Использование Headless-браузеров. Не какая-то новомодная фишка, используют ее уже давно и она помогает имитировать действия пользователей, маскируя ботов под реальных людей. То есть, вы до последнего делаете вид, что вы живой человек и что на странице вы поглощаете информацию, попутно решая свои SEO задачи, а когда вас уже обнаружили — меняете прокси и начинаете все заново.

Таким вот нехитрым способом при наличии достаточного пула ip адресов получается парсить крупные проекты.

Но еще одна интересная штука, что теперь нужно не просто имитировать что бот это человек, но и скрывать от ресурса что ты используешь Headless-браузер. Какие-то игры шпионов, получается, а не решение SEO задач продвинутым способом.

Собственно вот и пример стандартного кода, для работы с Headless-браузером

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
import random
from itertools import cycle

# Список прокси с логином и паролем
proxies_list = [
    {"proxy": "proxy1.example.com:8080", "username": "user1", "password": "pass1"},
    {"proxy": "proxy2.example.com:8080", "username": "user2", "password": "pass2"},
    {"proxy": "proxy3.example.com:8080", "username": "user3", "password": "pass3"},
    # Добавьте дополнительные прокси по аналогии
]

# Цикл прокси для ротации
proxy_pool = cycle(proxies_list)

# Настройки для Headless-браузера
def create_browser(proxy=None):
    chrome_options = Options()
    chrome_options.headless = True  # Включаем headless-режим
    chrome_options.add_argument("--disable-blink-features=AutomationControlled")  # Отключаем авто-обнаружение
    
    # Настройка прокси
    if proxy:
        chrome_options.add_argument(f'--proxy-server=http://{proxy["proxy"]}')
    
    # Дополнительные аргументы для скрытия headless
    chrome_options.add_argument("start-maximized")
    chrome_options.add_argument("disable-infobars")
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option("useAutomationExtension", False)
    
    # Настройка пути до драйвера Chrome
    browser = webdriver.Chrome(options=chrome_options)
    browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            })
        """
    })
    
    # Возвращаем инициализированный браузер
    return browser

# Имитируем пользовательское поведение
def mimic_user_behavior(browser):
    actions = [
        lambda: browser.execute_script("window.scrollBy(0, 300);"),  # Скролл вниз
        lambda: browser.execute_script("window.scrollBy(0, -300);"),  # Скролл вверх
        lambda: browser.execute_script("window.scrollBy(0, random.randint(0, 500));")  # Рандомный скролл
    ]
    random.choice(actions)()  # Выбираем случайное действие
    time.sleep(random.uniform(1, 3))  # Рандомная задержка

# Основная функция для обхода капчи
def bypass_captcha(url, num_attempts=5):
    for i in range(num_attempts):
        proxy_info = next(proxy_pool)  # Получаем новый прокси
        browser = create_browser(proxy_info)  # Запускаем браузер с прокси
        
        try:
            # Переходим на сайт
            browser.get(url)
            
            # Имитируем действия пользователя на сайте
            mimic_user_behavior(browser)
            
            # Пример проверки элемента на странице
            try:
                element = browser.find_element(By.XPATH, "//h1")
                print(f"Элемент найден: {element.text}")
            except Exception:
                print("Элемент не найден, возможно капча")
            
            # Проверка на успешный заход
            print(f"Попытка {i + 1} через прокси {proxy_info['proxy']} успешна")
        
        except Exception as e:
            print(f"Ошибка с прокси {proxy_info['proxy']}: {e}")
        
        finally:
            browser.quit()
        
        # Пауза между попытками
        time.sleep(random.uniform(2, 5))

# Запуск обхода капчи на целевом сайте
url = "https://example.com"  # Замените на нужный сайт
bypass_captcha(url)
  1. Ротация прокси с аутентификацией: код использует список прокси с логином и паролем. Ротация прокси через itertools.cycle дает возможность поочередно использовать прокси, создавая видимость новых подключений и затрудняя обнаружение бота.

  2. Настройки Headless Chrome: chrome_options.headless = True запускает браузер в режиме headless, а также включает настройки для сокрытия некоторых признаков автоматизации. Например, --disable-blink-features=AutomationControlled отключает функцию, которая может сигнализировать о работе скрипта.

  3. Скрытие признаков headless: в chrome_options передаются дополнительные аргументы, чтобы минимизировать следы headless-режима. Пример: excludeSwitches и useAutomationExtension отключают части интерфейса, которые могут детектироваться как признаки автоматизации, а Page.addScriptToEvaluateOnNewDocument убирает свойство navigator.webdriver, присущее headless-режиму. Этот подход аналогичен stealth-плагину в Puppeteer.

  4. Имитирование пользовательского поведения: функция mimic_user_behavior выполняет случайные скроллы, чтобы создать иллюзию взаимодействия пользователя с контентом. Подобный скроллинг снижает вероятность бана со стороны антибот-систем.

  5. Базовая обработка капчи: функция bypass_captcha запускает сессию браузера с ротацией прокси, имитируя переходы на сайт и выполняя пользовательские действия. Проверка элементов (find_element) помогает определить, успешен ли заход.

Плюсы и минусы подхода:

Плюсы:

Минусы:

  • Подход может быть недостаточно эффективен при парсинге высокозащищённых сайтов, особенно у поисковых систем, где используются сложные антибот-алгоритмы.

Мой бот, когда сайт усиливает защиту: 'Я? Я просто мимо проходил.'

Мой бот, когда сайт усиливает защиту: 'Я? Я просто мимо проходил.'

Обход капчи с использованием более сложных методов, машинное обучение

Для того. что полностью минимизировать траты на обход капчи, можно пойти по пути машинного обучения (это когда ты вручную тренируешь свою систему, на сотнях капч) либо использовать готовые решения, типа Tesseract (если по простому, примерно та же штука, но уже натренированная).

Бот: 'Я смогу обойти любую капчу!' Реальность: 'Ты даже reCAPTCHA v2 не можешь пройти.

Бот: 'Я смогу обойти любую капчу!' Реальность: 'Ты даже reCAPTCHA v2 не можешь пройти.

В обоих случаях решить через такую систему сложную капчу не выйдет, это решение подойдет только для распознавания текстовой капчи или классификации (разметке) изображений или чеков.

Где в SEO может понадобиться классификация изображений я не знаю (придумайте что нибудь сами), но это вполне себе рабочий вариант для легких капч. 

Это бесплатно и это эффективно. 

Примера кода не будет, так как это достаточно нишевая тема и универсального кода для разных вариантов не будет.

Плюсы — бесплатно и эффективно 

Минусы — не подходит для сложных капч

Заключение

Таким образом, если есть немного времени и желание покопаться в коде — способ 1 и 2 в комплексе с 3 ваш вариант, если хочется все максимально упростить — ищите сервисы, которые предоставляют инструменты для работы. Но рекомендовать что-то конкретное не буду, так как по хорошему — это тема отдельной статьи!

Безкапчевого вам доступа!

© Habrahabr.ru