Автоматизация может утомлять, особенно, если опыта в этом не так много, а задачи стоят «интересные» или «нестандартные» — читай сложные или невыполнимые. Не будем рассматривать все возможные варианты, почему задачу считается «интересной» или «нестандартной», а разберёмся с одной задачей, которая тормозит примерно 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 часто появляется при подозрении на автоматизацию. Имитация поведения реального пользователя помогает избежать блокировок. Однако имитация также бывает разная, и большинство крупных сервисов умеют вычислять ботов по попыткам неумело имитировать человеческую деятельность.
Методы имитации:
-
Задержки между запросами:
Используйте случайные задержки, чтобы запросы выглядели естественно.
-
Навигация по страницам:
Меняйте порядок перехода между страницами (например, сначала посещайте главную страницу).
-
Действия пользователя:
Добавьте прокрутку, клики и другие действия, используя инструменты вроде 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 браузеров для обхода защитных механизмов, предотвращающих появление капчи.
Преимущества:
-
Экономия бюджета:
Если инфраструктура для ротации уже есть (например, собственные прокси-сервисы или бесплатные Tor-узлы), затраты минимальны.
Нет необходимости покупать решения для распознавания капчи или оплачивать сторонние API.
-
Эффективность:
В ряде случаев можно полностью избежать появления капчи, особенно при низкой интенсивности запросов.
Сохраняется высокая скорость обработки данных, так как нет времени на распознавание капчи.
Недостатки:
Зависимость от качества прокси: Бесплатные решения могут быть ненадежными или медленными, а платные — дорогими (цены начинаются от $0.5 за IP при хорошем пуле).
Сложность настройки: Требуется тонкая настройка ротации и симуляции поведения пользователя.
Пример:
Для парсинга небольшого сайта с низким уровнем защиты — эффективен, обходится в ~$50/месяц на прокси.
Подход 2: Распознавание капчи
Суть: Вместо предотвращения, капчи распознаются через API (например, 2Captcha, SolveCaptcha) или собственные ML-модели.
Преимущества:
-
Экономия бюджета:
Не нужно покупать премиальные прокси или усложнять логику для предотвращения появления капчи.
Стоимость распознавания капчи через API может составлять от $0.5 до $1 за 1000 капч, что делает подход бюджетным при небольшом объеме запросов.
-
Эффективность:
Подходит для работы с капчами, которые сложно предотвратить (например, reCAPTCHA v2/v3).
Устраняется необходимость сложной работы с User-Agent и Cookies.
Недостатки:
Высокие затраты при больших объемах: Для крупных проектов (миллионы запросов) бюджет может расти экспоненциально.
Задержка: Время распознавания капчи через API может составлять от 5 до 20 секунд, что замедляет процесс.
Пример:
Для парсинга крупных маркетплейсов, где капча появляется часто, стоимость может составить ~$100 за 100,000 капч.
Подход 3: Совмещение предотвращения и распознавания капчи
Суть: Гибридная стратегия, где сначала применяются методы предотвращения капчи, а распознавание используется как резервный механизм.
Преимущества:
-
Экономия бюджета:
Количество капч для распознавания значительно сокращается благодаря ротации IP и User-Agent.
Снижает нагрузку на API-сервисы, что особенно важно при больших объемах запросов.
-
Эффективность:
Универсальность: позволяет обрабатывать сайты с разным уровнем защиты.
Гибкость: предотвращение минимизирует риск блокировки, а распознавание решает "последние мили" проблемы.
Недостатки:
Усложнение реализации: Требует настроить и поддерживать две системы (ротацию и распознавание).
Средние затраты: Дороже, чем каждый подход по отдельности, но может быть оптимальным по совокупности.
Пример:
-
Для крупного проекта с 1,000,000 запросов в месяц:
Прокси обходятся в $500.
Распознавание 10% капч через API — ещё $100.
Общая стоимость: $600 за высокий уровень стабильности.
Подход |
Экономия бюджета |
Эффективность |
Лучший случай применения |
Предотвращение |
Выгоден при настройке |
Эффективен для простых задач |
Небольшие сайты, редкие капчи |
Распознавание |
Дешев при малых объемах |
Универсален, но медленнее |
Высокий уровень защиты, частые капчи |
Совмещение |
Сбалансированный бюджет |
Максимальная стабильность |
Масштабные проекты с непредсказуемыми капчами |
Рекомендация: для масштабных проектов оптимален гибридный подход, сочетающий ротацию IP и User-Agent с резервным распознаванием.
Таким образом вопрос - как распознать капчу при автоматизации или парсинге достаточно сложный вопрос, так как ответ на него в лоб может быть не до конца полным и отвечающим требованиям вопрошающего, а вот вопрос - как эффективно использовать инструменты для предотвращения и распознавания капчи, чтобы снизить затраты и повысить эффективность, будет более точным и влечет за собой подробный ответ с примерами и сравне
Tishka17
Я надеюсь, все варианты представлены только в образовательных целях для того, чтобы разработчики, встаривающие капчу на свои ресурсы знали о модели угроз. Да?
Markus_automation Автор
Ну естественно, а кто то их выкладывает для другого?