CAPTCHA – полностью автоматизированный публичный тест Тьюринга для различения компьютерови людей! Все эти маленькие задачки и загадки, которые нужно решить, прежде чем сайт позволит вам перейти к реальному содержимому.
Если при обычном просмотре веб-страниц CAPTCHA могут доставить немало хлопот, то при попытке выполнить задания по веб-скрапингу они превращаются в настоящий раздражитель. По правде говоря, в этом и состоит их предназначение, но, тем не менее, это не облегчает вам жизнь, когда вы просто пытаетесь собрать информацию с разных сайтов.
Так что же мы можем с этим сделать? Именно об этом мы и поговорим в этой статье: какие типы CAPTCHA существуют и как решать их программно, уделяя особое внимание reCAPTCHA и hCaptcha
Пожалуйста, пристегните ремни безопасности и приготовьтесь к большому количеству светофоров 🚦, мотоциклов 🏍️ и пешеходных переходов 🚸!
Какие существуют различные типы капч?
Изначально CAPTCHA были довольно простыми, представляя собой изображение слегка искаженных текстовых символов, которые пользователь должен был ввести в текстовое поле.
Если введенный текст совпадал с изображением, сайт предполагал, что его отправил настоящий человек. Со временем OCR стал лучше, и CAPTCHA стали сложнее и труднее разгадывать. Сегодня CAPTCHA могут быть представлены в следующих вариантах:
- Текстовые
- С использованием флажков
- На основе изображений
- На основе аудио
- С ползунками
- 3D-объекты
- Математические вычисления
- Невидимые и пассивные
Текст
Один из самых распространенных типов CAPTCHA – текстовые, требующие от пользователя расшифровать текст на изображении и предоставить в ответ правильный ответ. Google использовал этот подход в своей первой версии reCAPTCHA для оцифровки книг.
Флажки
По крайней мере, с точки зрения UX, CAPTCHA с флажками – это, вероятно, самый простой тип CAPTCHA. Пользователь просто ставит галочку в соответствующем поле, и это “подтверждает”, что он не бот. Точный тип реализации может варьироваться, от чего-то простого вроде HTML-флажка () до более сложных реализаций, включающих JavaScript и запросы на стороне сервера.
Очень распространенным вариантом CAPTCHA с флажком является версия 2 собственного сервиса Google reCAPTCHA:
Другой распространенный сервис, использующий этот подход, – Cloudflare с Turnstile:
Изображения
Страшный 🚦, верно?
Да, это снова reCAPTCHA от Google, которая сделала капчу с изображением знаменитой. Здесь пользователь должен сопоставить изображение с определенным заданием и получить доступ после успешного завершения.
Этот тип CAPTCHA стал настолько известным, что даже попал в комикс xkcd.
Аудио
При использовании аудио CAPTCHA пользователям необходимо прослушать короткий аудиоклип и перевести слова в текст.
reCAPTCHA предоставляет такую возможность в качестве альтернативного решения доступности, особенно для людей с ослабленным зрением.
Слайдеры
Слайдерные CAPTCHA представляют собой особую форму графических CAPTCHA и требуют от пользователя расположить вырезанное изображение (обычно в форме кусочка головоломки) в правильном месте исходного изображения.
3D-объекты
3D-объекты – это довольно новое дополнение к CAPTCHA, и обычно они показывают вам набор различных трехмерных объектов в сцене вместе с инструкциями по выбору подходящей картинки или настройке сцены определенным образом.
Математические расчеты
Математические CAPTCHA проверяют ваши базовые арифметические навыки. В них вам предлагается ответить на основную математическую формулу, а чтобы пройти тест, нужно просто ввести правильное число.
Невидимые каптчи
Самые удобные CAPTCHA – это те, которые не требуют взаимодействия с пользователем, а работают прозрачно в фоновом режиме. Популярными реализациями являются reCAPTCHA от Google и Turnstile от Cloudflare.
Что такое reCAPTCHA?
reCAPTCHA – это бесплатный CAPTCHA-сервис, запущенный Google в 2007 году с целью предоставить владельцам сайтов простой способ интегрировать API CAPTCHA на основе SaaS в свои сайты. Изначально он также был разработан для помощи в оцифровке библиотечных и газетных архивов, предлагая пользователям отсканированный контент и, таким образом, обеспечивая краудсорсинг для преобразования документов, доступных только в печатном виде.
reCAPTCHA v1
Первая версия представляла собой типичную текстовую CAPTCHA, в которой пользователь должен был ввести слова, изображенные на картинке CAPTCHA. Вы можете увидеть ее скриншот в разделе “Тип текстовой CAPTCHA”.
Google прекратил поддержку версии 1 в 2018 году.
reCAPTCHA v2
версия reCAPTCHA v2 была выпущена в 2013 году и представила поведенческий анализ, что означает, что reCAPTCHA “отпечатывает” браузер и поведение пользователя (т. е. события ввода, такие как мышь и клавиатура) еще до того, как отобразит поле CAPTCHA, и по умолчанию показывает только флажок CAPTCHA. Как только пользователь нажимает на флажок, reCAPTCHA использует отпечаток пальца, чтобы определить, пройдет ли пользователь сразу или ему все же будет представлен правильный CAPTCHA-запрос.
Существует также “невидимая” реализация CAPTCHA, которая может быть прозрачно интегрирована в рабочие процессы вашего сайта.
reCAPTCHA v3
В 2018 году Google в очередной раз усовершенствовал reCAPTCHA и представил реализацию, которая вообще не требует взаимодействия с пользователем, а рассчитывает бот-счет, показывающий, насколько вероятно, что запрос исходит от реального человека, а не от автоматизированного скрипта.
Как обойти reCAPTCHA при веб-скрапинге
Итак, теперь, когда мы получили достаточно полное представление о том, какие типы CAPTCHA существуют, как мы можем использовать эти знания для того, чтобы наш веб-скрапер мог успешно извлекать данные, не натыкаясь на CAPTCHA?
К сожалению, универсального ответа на этот вопрос нет, но есть различные аспекты, которые необходимо учитывать, и именно их мы рассмотрим далее.
Решать проблемы с CAPTCHA программно
Один из подходов заключается в том, чтобы просто принять тот факт, что ваш скрапер может столкнуться с CAPTCHA, и попытаться решить их автоматически.
Существует множество сервисов для решения CAPTCHA, и мы рассмотрим один из них поближе буквально через минуту.
Избегайте CAPTCHA вообще
Другой и более эффективный способ – попытаться вообще избежать CAPTCHA. Сайты обычно используют CAPTCHA не сразу, а только если ваши запросы превысили определенный порог или были отмечены как ботоподобные. Чтобы избежать этого, всегда следите за тем, чтобы:
- Вести себя как настоящий браузер (headless браузеры, TLS fingerprinting)
- Обращайте внимание на специальные элементы honeypot на сайте
- Распределяйте запросы между агентами пользователя и IP-адресами (например, в идеале используйте прокси-серверы)
- Темп запросов (не ползайте слишком быстро)
Обход reCAPTCHA и hCaptcha с помощью API-сервиса для решения reCAPTCHA
Если вы наберете в поисковике “recaptcha solving service“, то найдете огромное количество платформ и сервисов (например, captchas.io, 2captcha.com, anti-captcha.com, capsolver.com и многие другие), которые предлагают очень похожий набор функций и, как правило, даже имеют схожую цену. Для следующего примера на Python мы выбрали anti-captcha.com и используем его CAPTCHA API для решения CAPTCHA на сайте https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox-explicit.php.
Прежде чем мы погрузимся в код, давайте сначала установим все необходимые зависимости с помощью pip.
pip install webdriver-manager selenium anticaptchaofficial
Как только они будут установлены, мы сможем перейти непосредственно к коду. Итак, без лишних слов, вот полный пример кода:
from selenium import webdriver
from selenium.webdriver.firefox.service import Service as FirefoxService
from webdriver_manager.firefox import GeckoDriverManager
from selenium.webdriver.common.by import By
from anticaptchaofficial.recaptchav3proxyless import *
import re
def solve_captcha(url, sitekey):
solver = recaptchaV3Proxyless()
solver.set_verbose(1)
solver.set_key("YOUR_API_KEY_HERE")
solver.set_website_url(url)
solver.set_website_key(sitekey)
solver.set_min_score(0.9)
return solver.solve_and_return_solution()
driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))
driver.get("https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox-explicit.php")
# Extract site key
sitekey = re.search('''sitekey['"]\s*:\s*(['"])(.+)\\1''', driver.page_source)
if sitekey == None:
print('No site key found, please configure manually')
driver.quit()
quit()
sitekey = sitekey.group(2)
user = driver.find_element(By.CSS_SELECTOR, 'input[name="ex-a"]')
user.clear()
user.send_keys('username')
pwd = driver.find_element(By.CSS_SELECTOR, 'input[name="ex-b"]')
pwd.clear()
pwd.send_keys('password')
captcha_response = solve_captcha(driver.current_url, sitekey)
if captcha_response == 0:
print('Error during CAPTCHA resolution')
driver.quit()
quit()
# Set CAPTCHA value
driver.execute_script('document.querySelector("#g-recaptcha-response").innerHTML="' + captcha_response + '"');
# Click submit button
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
Красиво, не правда ли? Но что именно мы здесь делаем? Давайте разберемся в этом пошагово
- Мы импортируем все необходимые библиотеки.
- Затем мы определяем функцию
solve_captcha
, которая выполняет фактический вызов сервиса к нашему CAPTCHA API. Подробнее об этом через секунду. - Далее мы инициализируем экземпляр веб-драйвера Firefox и сохраняем ссылку на него в driver. Это будет наш основной объект для взаимодействия с экземпляром браузера.
- Когда наш объект драйвера готов, мы можем вызвать его метод
get
, чтобы загрузить указанный URL в окно браузера. - Теперь, когда страница загружена, мы имеем доступ к HTML-коду (
.page_source
) и используем регулярное выражениеsitekey['"]\s*:\s*(['"])(.+)\1
для извлечения ключа сайта, настроенного на странице (позже мы передадим его вsolve_captcha
). - Далее мы используем метод
find_element
, чтобы найти два поля ввода и вызвать.clear()
и.send_keys()
для ввода пользовательского текста. - Время CAPTCHA! – теперь мы вызываем нашу функцию
solve_captcha
и передаем ей текущий URL, а также ключ сайта. Это будет блокирующий вызов, и сервису может потребоваться несколько секунд, чтобы вернуть правильное решение. - После того как
solve_captcha
вернется, вcaptcha_response
должен быть правильный ответ. Если он содержит значение “0”, то произошла ошибка. - Теперь мы запускаем пользовательский код JavaScript в контексте нашей страницы
(execute_script),
чтобы установить содержимое скрытого объекта<\textarea\>
для нашего решения CAPTCHA. - И последнее, но не менее важное: находим элемент
submit
(снова с помощьюfind_element
) и нажимаем на него, чтобы отправить нашу форму.
Если все прошло успешно, в окне браузера должно появиться сообщение об успехе.
Избегание reCAPTCHA и hCaptcha с помощью API веб-скрапинга
Несмотря на то что некоторые сайты так делают, большинство сайтов по умолчанию не беспокоят своих посетителей CAPTCHA, а только когда запросы либо превышают определенные пороги, настроенные в их системе WAF, либо следуют нетипичному для обычных пользователей шаблону. Для таких сайтов лучше всего оставаться незамеченным и сделать так, чтобы ваш скребок выглядел как можно более естественно. Для этого вам нужно уделить особое внимание следующим темам:
Реальная среда браузера
Ничто так быстро не выдаст ваш скрапер, как пользовательский агент HTTP-клиента по умолчанию, например, такой:
Java-http-client/17.0.7
PycURL/7.44.1 libcurl/7.81.0 GnuTLS/3.7.3 zlib/1.2.11 nghttp2/1.43.0 librtmp/2.3
И хотя существуют целые статьи в блогах о том, как работать с предоставленным пользовательским агентом, вероятно, будет недостаточно просто поменять его на стандартный пользовательский агент браузера (например, Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0)
, поскольку системы защиты от скрапинга обычно оценивают не только пользовательский агент, но и многое другое. Среди прочего, они также проверяют
- отпечаток пальца всего движка браузера
- особенности рукопожатия TLS
- возможность выполнения JavaScript-кода
Headless браузеры предлагают простой выход из этого затруднительного положения, поскольку они позволяют запускать ваш парсер в родной среде Интернета – обычном браузере со всеми его возможностями и функциями.
Адреса провайдеров
Хотя многие люди используют VPN (которые обычно поставляются с адресами дата-центров) и для обычных сеансов просмотра сайтов, большинство все же выходят в Сеть с обычными IP-адресами, назначенными провайдером. Если вы парсите сайт со своего обычного экземпляра AWS или GCP, ваши запросы сразу же выделятся своим IP-адресом, присвоенным центром обработки данных. Здесь на помощь могут прийти резидентные прокси-серверы, которые позволяют туннелировать запросы на скрап через обычные сети провайдеров, используемые обычными пользователями.
Знание аудитории сайта
Многие сайты имеют международную аудиторию, но если вы скрапите сайт, который предоставляет услуги для аудитории из определенного географического региона, он может подать сигнал тревоги, если вы вдруг запустите весь сайт с другого конца планеты. В этом случае на помощь могут прийти прокси-серверы, которые позволяют туннелировать запросы через конкретный регион. Особенно если речь идет о контенте с географическими ограничениями, такой подход просто необходим.
Темп запросов
Обращайте внимание на то, как быстро вы ползаете и скребёте сайт. скрапер может отправлять сотни запросов в секунду, но ни один обычный пользователь так не поступит. Поэтому убедитесь, что вы используете разумные и реалистичные задержки между отдельными запросами. Также старайтесь рандомизировать запросы (например, избегайте запросов с последовательными номерами) и учитывайте, что загрузка страницы включает в себя не только HTML-содержимое (например, изображения, таблицы стилей).
ℹ️ Убедитесь, что ваши запросы на скрапинг никогда не будут заблокированы
Если вы хотите узнать больше о том, как избежать CAPTCHA, ознакомьтесь с нашей статьей Web Scraping without getting blocked.
Использование API для скрапинга
Специализированные платформы для скрапинга, такие как ScrapingBee, делают всю эту тяжелую работу за вас из коробки. Они представляют собой своего рода швейцарский армейский нож и предоставляют все инструменты и реализации, о которых мы говорили, удобно расположенные в одном месте. Сюда входит беспрепятственный доступ к безголовым экземплярам браузера, прозрачная работа с прокси-серверами (включая жилые), встроенная поддержка JavaScript, управление дросселированием запросов и многое другое.
В заключение
CAPTCHA, безусловно, могут привести к большому разочарованию, когда вы просто хотите быстро завершить работу по скрапингу, но не стоит отчаиваться, так как существует множество способов борьбы с ними в контексте скрапера.
Мы надеемся, что вам понравилась эта статья и что мы смогли предоставить вам больше подробностей о мире CAPTCHA, а именно: какие существуют различные типы CAPTCHA, как решить их программно и какие инструменты использовать, чтобы избежать их вообще.
Всегда помните, что достаточно плохо, если вам приходится проходить через эти препятствия, когда вы просто просматриваете веб-страницы.
Вы же не хотите, чтобы то же самое пришлось делать и вашей работе по скрапингу.
ScrapingBee желает счастливого скрапинга и как можно меньше CAPTCHA!
Переведено с сайта сервиса ScrapingBee