SEO-кухня SEO-кухня 20.11.2024

Обход капчи: инструменты, подходящие для SEO

Разбираемся в тонкостях и делимся примерами кода для решения разных капч.

Обход капчи: инструменты, подходящие для SEO

Александр Герасимчук объяснил, что это такое, какие виды капчи бывают и самое главное — какими способами её можно обойти в SEO.

Капча и её значение в контексте SEO

Слово «капча» восходит к английскому captcha, что расшифровывается как Completely Automated Public Turing test to tell Computers and Humans Apart, а дословно переводится как «полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей».

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

Зачем капчу продолжают использовать

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

Уровень защиты сайта с помощью капчи
Уровень защиты сайта с помощью капчи

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

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

Если с Amazon понятно, они защищают свою инфраструктуру, что с более мелкими веб‑мастерами? Они тоже понимают, что ставить на сайт труднопроходимую капчу не очень хорошая идея, поскольку этим они создают дополнительные сложности для реальных посетителей. Чем сложнее капча, тем больше шансов, что пользователь просто уйдёт к конкуренту по поисковой выдаче

🔥 С Топвизором вам не нужно беспокоиться о капче, подключать сторонние сервисы для ее разгадывания и следить за парсингом. Сервис сделает всё сам, а вам останется только запустить проверку и получить ее результаты, неважно, проверяете ли вы позиции, частоту или используете какие-то другие инструменты. Запускайте проверки в Топвизоре в один клик!

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

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

Зачем нужен обход капчи

Есть несколько ситуаций, когда SEO‑специалист сталкивается с капчей:

  • работа с поисковыми системами — например, съём позиций, парсинг ключевых слов;

  • работа с сайтами конкурентов — например, анализ ресурса, парсинг контента;

  • автоматизация рутинных задач.

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

В 95% случаях SEO‑специалист обходит капчу при работе с поисковыми системами Яндекс, Google и, может, Bing или Rambler.

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

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

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

Через автоматизированные сервисы

Самый простой способ обхода любой капчи при парсинге поисковой системы — использование ресурсов стороннего сервиса. Таких сервисов на рынке огромное количество, наиболее популярные из них — 2Captcha, ruCaptcha, SolveCaptcha.

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

Если детально разбираться в документации сервисов, можно обнаружить, что есть возможность платить только за решённые капчи, а за те, которые не решены, не платить. Это работает, если правильно настроить все передаваемые параметры.

Легко сказать — передать капчу, а как это сделать? Даже для новичка в работе с кодом это не самый сложный вопрос. 

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

Задачи специалиста:

  • определиться с видом капчи;

  • изучить документацию сервиса;

  • определить обязательные параметры, которые нужно отправить в сервис распознавания капчи;

  • написать код и вставить его в структуру своего скрипта или программы.

Пример кода для решения reCaptcha V2 на Python: 

import requests
import time

API_KEY = 'ВАШ_КЛЮЧ_2CAPTCHA'  # Ваш API-ключ 2Captcha
SITE_KEY = 'ВАШ_SITE_KEY'  # Ваш site key для reCaptcha
PAGE_URL = 'https://example.com'  # URL страницы с капчей

def get_captcha_solution():
    # Этап 1: Отправка капчи на решение
    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']}")
        if captcha_id_response['request'] == "ERROR_NO_SLOT_AVAILABLE":
            # Подождем и попробуем снова
            print("Слотов нет, ждем 10 секунд и пробуем снова.")
            time.sleep(10)
            return get_captcha_solution()
        return None

    captcha_id = captcha_id_response['request']
    print(f"Капча отправлена на решение. ID: {captcha_id}")
    
    # Этап 2: Ожидание решения капчи
    for attempt in range(30):  # 30 попыток с интервалом в 5 секунд
        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('Не удалось решить капчу.')

В данном примере необходимо найти на странице один параметр — в коде он называется site_key, а на странице с капчей, как правило, указан sitekey. Этот параметр вместе с URL капчи и ключом API от сервиса 2Сaptcha нужно отправить на сервер, а когда получите токен с решением, необходимо подставить его в капчу. После этого можно продолжать работу с сайтом. 

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

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

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

С использованием прокси и ротации IP‑адресов

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

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

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

Можно использовать резидентные прокси от 2Captcha с ротацией — тогда не нужен пул 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)  # Настройте задержку в зависимости от требований

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

Хороший пример — сервис LinkedIn: у них настроена система таким образом, что три раза с одного IP‑адреса можно авторизоваться без ввода капчи, а на третий раз появляется капча. Зная эту особенность, нужно настроить ротацию прокси и радоваться, что взломали систему… Пока не пофиксят, конечно 😀

Преимущества: решение не требует интеграции сторонних сервисов, если у вас есть собственный пул IP‑адресов.

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

С помощью эмуляторов браузера

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

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

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

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

Пример стандартного кода для работы с headless‑браузером:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// Подключаем stealth-плагин для сокрытия headless-режима
puppeteer.use(StealthPlugin());

(async () => {
    const browser = await puppeteer.launch({
        headless: false,  // Чтобы увидеть процесс (можно отключить для реальной работы)
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--window-size=1920,1080'
        ]
    });
    
    const page = await browser.newPage();
    
    // Устанавливаем заголовки, чтобы выглядеть как настоящий пользователь
    await page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0");
    await page.setViewport({ width: 1280, height: 800 });

    // Ждем 2 секунды для имитации реального поведения
    await page.waitForTimeout(2000);
    
    // Прокручиваем страницу, чтобы избежать триггеров капчи
    await page.evaluate(() => {
        window.scrollBy(0, window.innerHeight);
    });

    // Ждем перед выполнением действий, чтобы капча не появилась
    await page.waitForTimeout(2000);

    // Выполняем действия, такие как ввод текста или клики
    await page.type('#search', 'Some search query', { delay: 100 });  // Медленная печать текста
    await page.click('#submit');  // Клик по кнопке

    // Завершение сессии
    await browser.close();
})();

Несколько комментариев относительно кода:

Stealth‑плагин: puppeteer‑extra‑plugin‑stealth помогает скрыть признаки headless‑режима, такие как navigator.webdriver, которые сайты используют для обнаружения автоматизированных скриптов.

Настройки User‑Agent и заголовков: установка User‑Agent и размеров окна браузера (viewport) делает браузер похожим на стандартный.

Задержки между действиями: использование задержек (waitForTimeout, type и delay) помогает избежать быстрых действий, которые могут показаться автоматическими.

Скроллинг страницы: прокрутка (window.scrollBy) создаёт иллюзию взаимодействия с контентом.

Изменение прокси: для ротации IP можно запускать Puppeteer через различные прокси, чтобы каждый новый сеанс начинался с другого адреса — это снижает вероятность появления капчи.

Преимущества: дешевле по сравнению с предыдущими методами.

Недостатки: headless‑браузеры могут быть неэффективны при парсинге хорошо защищённых сайтов (к таким относятся поисковые системы).

🗣️ Цитата

«Эмуляторы браузеров применяются в самых сложных случаях, когда простым запросом получить информацию не удаётся никак. А в качестве побочного эффекта они позволяют решить капчу с помощью кликов, как реальный пользователь».

Более сложные методы, включающие машинное обучение

Чтобы минимизировать траты на распознавание капчи, можно воспользоваться машинным обучением — это ручная тренировка системы по распознаванию капчи. Можно использовать готовые решения, например Tesseract — проще говоря, примерно тот же механизм, но уже натренированный.

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

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

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

Преимущества: бесплатно и эффективно.

Недостатки: не подходит для сложных капч.

Какой метод выбрать

Если есть немного времени и желание покопаться в коде, первый и второй способы в комплексе с третьим — ваш вариант. Если хочется всё максимально упростить, ищите сервисы, которые предоставляют инструменты для работы. Но рекомендовать что‑то конкретное не буду, так как это тема отдельной статьи!

🔥 Более детально познакомиться с моими работами, в том числе с подробным кодом для обхода капчи, можно на GitHub.

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

Больше о капче и других тонкостях парсинга 👇

Распознавание капчи: лучшие сервисы для комфортной работы

Что такое веб‑скрейпинг и как он работает

Как защитить контент сайта от воровства