
CAPTCHA представляет собой одну из самых серьезных проблем для разработчиков, работающих над задачами веб-скрейпинга и автоматизации. Этот механизм безопасности, призванный отличать людей от ботов, может значительно усложнить выполнение даже законных задач автоматизации. Чтобы создавать эффективные инструменты для сбора данных, важно понимать, как работает CAPTCHA, и какие методы можно использовать для её обхода.
Что такое CAPTCHA?
CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) — это инструмент защиты, который помогает различать реальных пользователей и автоматизированные программы. Он используется для предотвращения спама, защиты от атак методом перебора паролей и массового сбора информации с веб-сайтов. CAPTCHA основана на задачах, которые легко решаются человеком, но представляют трудности для машин.
Почему используется CAPTCHA?
CAPTCHA внедряется на веб-сайты для выполнения следующих задач:
Блокировка автоматических действий. CAPTCHA предотвращает создание ботами фейковых аккаунтов, отправку спама и массовый сбор данных.
Усиление безопасности. Механизм защищает страницы входа от атак методом перебора паролей.
Ограничение доступа к ценному контенту. Некоторые сайты используют CAPTCHA для защиты премиум-контента (например, научных публикаций или новостей).
Защита от DDoS-атак. CAPTCHA фильтрует подозрительный трафик, снижая вероятность атак на сервер.
Как работает CAPTCHA?
CAPTCHA предлагает задания, которые требуют визуального восприятия или когнитивных навыков, доступных человеку, но сложных для автоматических систем. Работа CAPTCHA включает следующие этапы:
Активация. Система анализирует параметры трафика: IP-адрес, поведение браузера, частоту запросов. При обнаружении подозрительной активности активируется CAPTCHA.
Предоставление задания. Пользователю предлагается задача: распознать текст, выбрать объекты на изображении или решить головоломку.
Ответ пользователя. Пользователь выполняет задание и отправляет ответ.
Проверка результата. Если ответ верный, доступ предоставляется. В противном случае может быть предложена новая задача.
Современные технологии, такие как reCAPTCHA v3 и Cloudflare Turnstile, используют анализ поведения вместо явных задач. Они оценивают действия пользователя и присваивают риск-оценку, позволяя большинству людей проходить проверку без дополнительных заданий.
Однако CAPTCHA создаёт сложности не только для ботов, но и для исследователей, разработчиков и других специалистов, использующих автоматизацию в законных целях. Поэтому в индустрии активно разрабатываются решения для обхода CAPTCHA.
Основные типы CAPTCHA
Существует несколько типов CAPTCHA, каждая из которых имеет свои особенности:
1. Текстовая CAPTCHA
Пользователю нужно расшифровать искажённые символы. Этот тип широко распространён, но современные алгоритмы OCR (оптического распознавания символов) могут справляться с такими задачами.
2. CAPTCHA на основе изображений
Пользователям предлагают выбрать определённые объекты (например, светофоры или мосты) из набора изображений. Для машин такие задачи сложны, но технологии распознавания изображений постоянно совершенствуются.
3. Слайдер-CAPTCHA
Пользователь должен переместить элемент головоломки в нужное положение. Этот тип проверяет мелкую моторику, что затрудняет автоматизацию.
4. Аудио-CAPTCHA
Для слабовидящих пользователей предлагаются задания с искажённой речью, которую нужно воспроизвести в текстовом формате. Такие задачи сложны даже для человека.
5. CAPTCHA на основе поведения
Этот тип анализирует действия пользователя, такие как движения мыши или скорость ввода текста, чтобы определить, является ли пользователь человеком. Ботам сложно имитировать такие действия.
6. CAPTCHA на основе риска
Системы, такие как reCAPTCHA v3 или Cloudflare Turnstile, не требуют явного взаимодействия. Они оценивают поведение пользователя и определяют, насколько оно похоже на действия человека.
Каждый из этих типов требует индивидуального подхода для обхода.
Методы решения CAPTCHA
1. Сервисы для решения CAPTCHA
Разработка собственного решателя CAPTCHA требует значительных ресурсов. Гораздо проще использовать сторонние сервисы, такие как CapSolver. Эти сервисы предлагают API для автоматизации решения задач, включая reCAPTCHA и другие типы CAPTCHA.
Пример использования API CapSolver в Python:
import requests
def solve_captcha(api_key, site_key, url):
response = requests.post("https://api.capsolver.com/solve", json={
"apiKey": api_key,
"siteKey": site_key,
"url": url
})
return response.json().get("code")
captcha_token = solve_captcha("YOUR_API_KEY", "SITE_KEY", "https://example.com")
print("Captcha Solved Token:", captcha_token)
2. OCR для текстовой CAPTCHA
Для распознавания текста можно использовать библиотеки OCR, такие как Tesseract OCR. Однако современные CAPTCHA используют искажения и шум, затрудняя распознавание.
import pytesseract
from PIL import Image
image = Image.open("captcha_image.png")
text = pytesseract.image_to_string(image)
print("Extracted Captcha Text:", text)
3. Машинное обучение для CAPTCHA на изображениях
Глубокие нейронные сети, обученные на специальных наборах данных, могут распознавать объекты на изображениях. Однако создание таких моделей требует большого количества данных и вычислительных ресурсов.
4. Решение слайдер-CAPTCHA
Слайдер-CAPTCHA можно обойти с помощью анализа изображений. Например, библиотека OpenCV позволяет находить зазоры в фоновом изображении.
import cv2
import numpy as np
def find_gap(image_path):
image = cv2.imread(image_path, 0)
edges = cv2.Canny(image, 50, 150)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
if w > 30: # Предполагаемый зазор
return x
return None
5. Имитирование поведения человека
Для обмана поведенческих CAPTCHA можно использовать скрипты, которые имитируют действия человека, например, случайные движения мыши или задержки между действиями.
from selenium.webdriver.common.action_chains import ActionChains
import random, time
def human_like_drag(driver, element, target_x):
action = ActionChains(driver)
action.click_and_hold(element)
current_x = 0
while current_x < target_x:
move_by = random.randint(1, 5)
action.move_by_offset(move_by, 0)
time.sleep(random.uniform(0.02, 0.1))
current_x += move_by
action.release().perform()
Заключение
Решение CAPTCHA — сложная задача, требующая различных подходов в зависимости от типа задачи. Хотя OCR и машинное обучение могут помочь, они часто сталкиваются с ограничениями современных методов защиты. Для большинства задач веб-скрейпинга оптимальным решением станет использование специализированных сервисов, таких как CapSolver, которые позволяют автоматизировать обработку CAPTCHA с минимальными усилиями.
Emelian
Если говорить не «вообще», а «конкретно», то вполне можно использовать веб-скрапинг с помощью расширений на старых версиях Хрома, все еще поддерживающих вторую версию манифеста.
При этом, начальную капчу мы проходим вручную, потом это дает нам какое-то количество времени (обычно, минут 5 – 30) до появления следующей капчи. Во время этого интервала мы запускаем свой небольшой скрипт расширения, который с небольшой задержкой, скажем, секунд пять, делает запросы на загрузку необходимых html-страниц, которые мы просто тупо сохраняем в своем каталоге. Их обработкой мы можем заняться потом, когда уже все скачаем, Это может быть и сотня тысяч страниц.
При этом, в процессе скачивания страниц мы можем отследить начало сбоя. В Хроме это хорошо видно. Останавливаем скрипт, переинициализируем его, при необходимости, снова вручную набираем соответствующий url в Хроме, опять проходим капчу (при подозрении сервера, он может запрашивать ее несколько раз). Для профилактики подозрений, периодически меняем ай-пи, например, посредством вэпээна.
Скриптом расширения, хотя там всего пара десятков строчек, делиться не буду, чтобы не палиться. Раньше я использовал скрипты Питона для аналогичных целей, пока не столкнулся с капчей. С ней возникли проблемы, пока не нашел в Интернете подходящий прототип расширения на базе второй версии манифеста (современный Хром поддерживает только третью, значительно урезанную в своих возможностях). Слегка доделал его «напильником» и вуаля…
Alex-Freeman
В ручную это хорошо когда у вас несколько потоков и сайт небольшой, помню у нас 10 человек в свое время сидело и только и делало, что капчи в ручную вводило, даже кофе не успевали попить)
Серьезно? VPN с их заезженными IP, старая версия хрома, что еще? У вас такой траст будет, что вам или левые данные будут скармливать или капчи каждую минуту показывать. Еще расскажите как отпечаток менять в хроме, чтобы траст не падал)
Emelian
Я ведь реальные истории рассказываю, не выдуманные. И случаи описываю не «вообще», а «конкретно». Мои старые скрипты на Питоне здесь уже не работали (из-за капчи). А новые, на втором манифесте Хрома, вполне..
Два разных сайта загрузил на десятки тысяч страниц (порядка ста, каждый). На каждый ушло по месяцу, примерно. Сайты крутили время доступа от 5 до 30 минут, потом обратно. Это несколько напрягало, но, параллельно, занимался другой работой, да и спешить мне было особо некуда.
Сначала увлекался, задержки между запросами были нулевые и сайты мои вэпээны быстро банили. Но всегда их «хавали» при ротации. Допускаю, что, сервера слишком понадеялись на свои капчи и другие способы защиты особо не использовали, хотя, я постоянно ждал подвоха с их стороны.
Как бы там ни было, все сработало, результат я свой получил. Были еще проблемы, связанные с необходимостью рендеринга страниц, но уже для других сайтов. Для этого тоже нашел подходящие прототипы для Хрома. Начальные эксперименты были удачны, но потом, просто, по разным причинам, интерес к этим серверным данным пропал, и этот проект я забросил до тех пор, пока не возникнет аналогичная потребность снова.
Таким образом, на универсальность не претендую, но свои личные проблемы решил. Более того, все данные корректны, я их полностью обработал и проверил. А вот, когда работал с подобными скриптами на Питоне, без капч, то, да, за ними нужен был глаз да глаз. Данные отгружали всегда, но после небольшого объема корректных данных начинали поступать некорректные. Да и задержку между запросами там нужно было выставлять секунд пятнадцать, не меньше, ибо очень подозрительные сервера были. Зато особо не придирались к ай-пи, можно было работать без вэпээна. Короче говоря, везде использовал специфику частных случаев…