Автоматизация может утомлять, особенно, если опыта в этом не так много, а задачи стоят «интересные» или «нестандартные» — читай сложные или невыполнимые. Не будем рассматривать все возможные варианты, почему задачу считается «интересной» или «нестандартной», а разберёмся с одной задачей, которая тормозит примерно 50% неопытных автоматизаторов — Как пройти капчу! 

Что такое капча - краткое введение в предмет

О капче написано огромное количество статей, если хотите подробно разобраться в вопросе, рекомендую эту статью - Распознавание капчи – разбираемся в сложном, для понимания процессе, максимально просто

Если коротко - капча это способ защитить сервис (интернет сайт или приложение) от ботов и спамеров. 

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

Чем сложнее капча, тем сложнее ее обходить, а чем сложнее ее обходить, тем сложнее предусмотреть все тонкости и нюансы 

С какими проблемами сталкиваются разработчики при парсинге сайтов

Существует пул проблем, которые считаются стандартными и которые не стоит игнорировать при массовых действиях, таких как парсинг данных или сайтов:

  • ограничения на уровне IP

  • распознавание автоматических действий

  • появление CAPTCHA

  • ловушки и антибот технологии

Все эти проблемы в том или ином случае связаны с капчей. Давайте разбираться подробнее.

Ограничения на уровне IP приводит к необходимости пройти капчу

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

Более того, если один и тот же IP адрес будет часто попадать на капчу (опять же, из-за частых запросов к сайту) - этот IP может легко улететь в бан или быть ограничен. В лайт версии увеличатся расходы на распознавание капчи, а в более тяжелом варианте, сервис не будет доступен с указанного IP

Распознавание автоматических действий, если вас заподозрили - вам нужно пройти капчу

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

Также, использование устаревших или некорректных User-Agent может выдавать автоматизацию. Это, опять же, может привести к появлению капчи, попаданию IP в список подозрительных и бану, со всеми вытекающими последствиями.

Появление CAPTCHA или как пройти капчу, если она неизбежна!

Современные CAPTCHA стали сложнее, они прошли долгий путь от текстовых CAPTCHA до графических (выбор картинок) и аудио-версий, а также невидимых решений, таких как Google reCAPTCHA v3.

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

Ловушки и антибот технологии - попался, негодник - требуется пройти капчу!

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

Последствия, к которым приводят неаккуратные действия, либо неучтенные нюансы при парсинге данных или сайтов

Все описанные проблемы приводят к последствиям, в частности:

  • Задержки в обработке данных: Каждый случай появления CAPTCHA замедляет процесс автоматизации.

  • Снижение эффективности: Неправильное решение CAPTCHA приводит к потере запросов.

  • Увеличение затрат: Массовое использование API для решения CAPTCHA или прокси повышает стоимость.

  • Блокировки: Частое появление CAPTCHA может привести к бану IP-адресов или аккаунтов.

Как пройти капчу - практические советы, подходи к вопросу профессионально!

1. Ротация IP - лучший способ избежать требования пройти капчу и доказать что ты не робот

CAPTCHA часто вызывается из-за большого количества запросов с одного и того же IP-адреса. Я писал выше, что использование одного и того же IP является моветоном. Поэтому используем ротацию прокси! Ротация IP позволяет снизить подозрения о бот-активности.

Принцип работы:

  • Использование прокси-серверов для изменения IP-адреса, с которого отправляются запросы.

  • Каждому новому запросу назначается новый IP, чтобы создать впечатление множества разных пользователей.

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

Типы прокси:

  • Резидентные прокси: IP-адреса, принадлежащие реальным устройствам, расположенным в домах. Они меньше вызывают подозрений, но дороже.

  • Датацентр прокси: Более дешёвые IP-адреса, предоставляемые дата-центрами, но их легче распознать как автоматизированные.

  • Мобильные прокси: Самые надёжные, так как используют IP сотовых сетей, но они также самые дорогие.

Более подробно вы можете ознакомиться с видами прокси в этой статье - Резидентные, мобильные или серверные прокси? Взгляд дилетанта

Пример реализации ротации, на Python:

import requests
import itertools

# Список прокси
proxy_list = [
    {"http": "http://27.64.18.8:10004", "https": "http://27.64.18.8:10004"},
    {"http": "http://161.35.70.249:3128", "https": "http://161.35.70.249:3129"},
]

# Функция ротации прокси
def proxy_rotator(proxy_list):
    return itertools.cycle(proxy_list)

proxy_gen = proxy_rotator(proxy_list)

# Пример запроса с ротацией прокси
for _ in range(3):
    proxy = next(proxy_gen)
    response = requests.get("https://httpbin.org/ip", proxies=proxy)
    print(response.text)

Советы:

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

  • Не используйте бесплатные прокси - они, как правило давно известны и часто блокируются (если не сказать всегда).

2. Как пройти капчу быстрее или Ротация User-Agent

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

Принцип работы:

  • Использование списка популярных User-Agent, имитирующих разные браузеры и устройства.

  • Регулярное изменение User-Agent для каждого запроса.

Пример, как выглядит список User-Agent:

user_agent_list = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
]

Пример реализации ротации User-Agent:

import requests
import itertools

# Список User-Agent
user_agent_list = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
]

# Функция ротации User-Agent
def rotate_ua(user_agent_list):
    return itertools.cycle(user_agent_list)

user_agent_gen = rotate_ua(user_agent_list)

# Пример запроса с ротацией User-Agent
for _ in range(3):
    headers = {"User-Agent": next(user_agent_gen)}
    response = requests.get("https://httpbin.org/user-agent", headers=headers)
    print(response.text)

Советы:

  • Используйте только актуальные User-Agent и проверяйте их перед использованием.

  • Убедитесь, что User-Agent соответствует другим HTTP-заголовкам (например, рефере).

У меня был случай, когда неккоректно подобраный User-Agent поломал процесс парсинга, сайт никак не хотел отдавать запрашиваемые данные…

3. Работа с cookies помогает пройти капчу или не допустить ее появление

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

Принцип работы:

  • Сохранение cookies после первоначального запроса.

  • Повторное использование сохранённых cookies для всех последующих запросов.

Пример сохранения и загрузки cookies:

import requests
import json

# Создание сессии
session = requests.Session()

# Установка cookies
session.get("https://httpbin.org/cookies/set?name=value")

# Сохранение cookies в файл
with open("cookies.json", "w") as f:
    json.dump(requests.utils.dict_from_cookiejar(session.cookies), f)

# Загрузка cookies из файла
with open("cookies.json", "r") as f:
    cookies = requests.utils.cookiejar_from_dict(json.load(f))
    session.cookies.update(cookies)

# Отправка запроса с сохранёнными cookies
response = session.get("https://httpbin.org/cookies")
print(response.text)

Советы:

  • Используйте cookies для авторизованных запросов.

  • Убедитесь, что cookies актуальны, так как они могут истекать.

4. Имитация человеческого поведения - не панацея, но пройти капчу с ней легче чем без нее

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

CAPTCHA: Вы действуете как бот. Я: Добавляю случайные задержки между действиями. CAPTCHA: Все еще бот.
CAPTCHA: Вы действуете как бот.
Я: Добавляю случайные задержки между действиями.
CAPTCHA: Все еще бот.

Методы имитации:

  • Задержки между запросами:

    • Используйте случайные задержки, чтобы запросы выглядели естественно.

  • Навигация по страницам:

    • Меняйте порядок перехода между страницами (например, сначала посещайте главную страницу).

  • Действия пользователя:

    • Добавьте прокрутку, клики и другие действия, используя инструменты вроде Selenium.

В общем - рандомизация является главным ключом к умелой имитации.

Пример задержек между запросами:

import time
import random
import requests

urls = [
    "https://httpbin.org/get?page=1",
    "https://httpbin.org/get?page=2",
    "https://httpbin.org/get?page=3",
]

for url in urls:
    response = requests.get(url)
    print(f"Response from {url}: {response.status_code}")
    delay = random.uniform(1, 5)
    print(f"Waiting for {delay:.2f} seconds...")
    time.sleep(delay)

Пример с использованием Selenium:

from selenium import webdriver
import time

driver = webdriver.Chrome()

driver.get("https://example.com")
time.sleep(2)  # Имитация ожидания пользователя

# Прокрутка страницы
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)

# Клик по элементу
element = driver.find_element_by_id("some_id")
element.click()
time.sleep(2)

driver.quit()

Советы:

  • Добавляйте случайные элементы поведения, такие как прокрутка или клики.

  • Используйте headless-браузеры для симуляции более сложных действий.

Как пройти капчу стандартными “дедовскими” методами (что рекомендуют опытные коллеги)

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

Рассмотрим основные методы - как обойти капчу. К ним я отнесу:

  • Сервисы по распознаванию CAPTCHA.

  • OCR-алгоритмы.

  • Использование headless-браузеров.

Как распознать капчу через сервисы распознавания капчи

Существует огромное количество сервисов решения капчи, 2Captcha, Solvecaptcha и все эти сервисы распознавания капчи доступны через прямую интеграцию, через АПИ и через уже готовые модули, которых в избытке можно найти на Github.

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

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

Другое дело - если использовать уже готовый модуль, я для демонстрации взял модуль - captcha-solver-selenium-python-examples, в котором интегрировано несколько видов капчи. Вернее несколько капча решателей для различных типов капчи.

Я сделал короткое видео в котором показываю как распознать капчу, причем это три разных капчи (координатная, текстовая и reCAPTCHA V2). Я не стал намеренно ничего менять в готовом модуле, чтобы показать, что все работает из коробки, но стоит учитывать, что он решает капчу с демо-страницы и для того, чтобы модуль сработал на другой странице может потребоваться доработать модуль. Как минимум, изменить УРЛ страницы, на котором расположена капча.

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

В видео видно, что даже при минимальной подготовке (я описал ее выше) модуль работает как универсальный механизм. Как распознать текстовую капчу? Используй пример в модуле под названием - текстовая капча! Как распознать reCAPTCHA V2? Используй пример в модуле под названием - reCAPTCHA V2! 

Ну думаю дальше вы поняли схему!

Сравнение методов - что эффективнее предотвратить появление капчи или пройти появившуюся капчу?

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

Предлагаю коротко сравнить описанные методы и добавить к ним третий:

Подход 1: Предотвращение появления капчи

Суть: Использование ротации IP-адресов, смены User-Agent, работы с Cookies и применения headless браузеров для обхода защитных механизмов, предотвращающих появление капчи.

Преимущества:

  1. Экономия бюджета:

    • Если инфраструктура для ротации уже есть (например, собственные прокси-сервисы или бесплатные Tor-узлы), затраты минимальны.

    • Нет необходимости покупать решения для распознавания капчи или оплачивать сторонние API.

  2. Эффективность:

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

    • Сохраняется высокая скорость обработки данных, так как нет времени на распознавание капчи.

Недостатки:

  • Зависимость от качества прокси: Бесплатные решения могут быть ненадежными или медленными, а платные — дорогими (цены начинаются от $0.5 за IP при хорошем пуле).

  • Сложность настройки: Требуется тонкая настройка ротации и симуляции поведения пользователя.

Пример:

  • Для парсинга небольшого сайта с низким уровнем защиты — эффективен, обходится в ~$50/месяц на прокси.


Подход 2: Распознавание капчи

Суть: Вместо предотвращения, капчи распознаются через API (например, 2Captcha, SolveCaptcha) или собственные ML-модели.

Преимущества:

  1. Экономия бюджета:

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

    • Стоимость распознавания капчи через API может составлять от $0.5 до $1 за 1000 капч, что делает подход бюджетным при небольшом объеме запросов.

  2. Эффективность:

    • Подходит для работы с капчами, которые сложно предотвратить (например, reCAPTCHA v2/v3).

    • Устраняется необходимость сложной работы с User-Agent и Cookies.

Недостатки:

  • Высокие затраты при больших объемах: Для крупных проектов (миллионы запросов) бюджет может расти экспоненциально.

  • Задержка: Время распознавания капчи через API может составлять от 5 до 20 секунд, что замедляет процесс.

Пример:

  • Для парсинга крупных маркетплейсов, где капча появляется часто, стоимость может составить ~$100 за 100,000 капч.


Подход 3: Совмещение предотвращения и распознавания капчи

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

Преимущества:

  1. Экономия бюджета:

    • Количество капч для распознавания значительно сокращается благодаря ротации IP и User-Agent.

    • Снижает нагрузку на API-сервисы, что особенно важно при больших объемах запросов.

  2. Эффективность:

    • Универсальность: позволяет обрабатывать сайты с разным уровнем защиты.

    • Гибкость: предотвращение минимизирует риск блокировки, а распознавание решает "последние мили" проблемы.

Недостатки:

  • Усложнение реализации: Требует настроить и поддерживать две системы (ротацию и распознавание).

  • Средние затраты: Дороже, чем каждый подход по отдельности, но может быть оптимальным по совокупности.

Пример:

  • Для крупного проекта с 1,000,000 запросов в месяц:

    • Прокси обходятся в $500.

    • Распознавание 10% капч через API — ещё $100.

    • Общая стоимость: $600 за высокий уровень стабильности.

Подход

Экономия бюджета

Эффективность

Лучший случай применения

Предотвращение

Выгоден при настройке

Эффективен для простых задач

Небольшие сайты, редкие капчи

Распознавание

Дешев при малых объемах

Универсален, но медленнее

Высокий уровень защиты, частые капчи

Совмещение

Сбалансированный бюджет

Максимальная стабильность

Масштабные проекты с непредсказуемыми капчами

Рекомендация: для масштабных проектов оптимален гибридный подход, сочетающий ротацию IP и User-Agent с резервным распознаванием.

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

Комментарии (2)


  1. Tishka17
    16.12.2024 09:00

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


    1. Markus_automation Автор
      16.12.2024 09:00

      Ну естественно, а кто то их выкладывает для другого?