CAPTCHA в сборе данных: диагностика и безопасная реакция
Как отличить CAPTCHA от 403, 429 и сбоя прокси, снизить нагрузку на источник и решить, когда остановить сбор или перейти на API.
Команда InfraProxy
5 февраля 2026 г.•обновлено 18 августа 2026 г.
CAPTCHA означает, что источник не готов обслуживать запрос в текущем режиме. Не пытайтесь «продавить» проверку повторными запросами: сначала отделите ограничение сайта от ошибки прокси и уменьшите нагрузку.
CAPTCHA, 403 и 429 — разные события
Один статус не описывает всю причину. Сборщик должен сохранять HTTP-код, заголовки, тип содержимого, первые безопасные признаки тела ответа и сетевую ошибку отдельно.
| Сигнал | Что подтверждено | Следующий шаг |
|---|---|---|
CAPTCHA в HTML при 200 |
Ответ получен, но вместо данных пришла проверка | Остановить повторы, проверить разрешённость источника и частоту |
403 Forbidden |
Сервер отказал запросу | Не считать прокси «мёртвым»; проверить правила доступа и тело ответа |
429 Too Many Requests |
Превышен лимит запросов | Учесть Retry-After, снизить параллельность и частоту |
503 Service Unavailable |
Источник временно недоступен или перегружен | Сделать ограниченный backoff; не ротировать IP в цикле |
| timeout / TLS error | HTTP-ответ не получен | Проверить маршрут, DNS, прокси и таймаут отдельно |
По спецификации HTTP ответ 429 может содержать Retry-After: число секунд или дату следующей допустимой попытки. Это описано в документации MDN.
Как построить безопасную реакцию на ограничение
Базовый обработчик не должен бесконечно повторять запрос. Установите предел попыток, общий временной бюджет и отдельные правила для сетевой ошибки, 429 и CAPTCHA.
import random
import time
import requests
MAX_ATTEMPTS = 3
def fetch_public_page(url: str) -> requests.Response:
for attempt in range(MAX_ATTEMPTS):
response = requests.get(
url,
timeout=20,
headers={"User-Agent": "CompanyDataBot/1.0 contact@example.com"},
)
if response.status_code == 429:
retry_after = response.headers.get("Retry-After")
delay = int(retry_after) if retry_after and retry_after.isdigit() else 2 ** attempt
time.sleep(delay + random.uniform(0, 0.5))
continue
response.raise_for_status()
return response
raise RuntimeError("Лимит повторов исчерпан; сбор остановлен")
Код показывает контроль повторов, а не способ обойти ограничение. В production добавьте метрики по домену: долю 200, 403, 429, CAPTCHA-ответов, таймаутов и число повторов на успешную запись.
Когда прокси не решают проблему
Новый IP не меняет правила ресурса, лимит API, требование авторизации или запрет в robots.txt. Если источник отвечает 429, ротация адресов ради сохранения прежней нагрузки маскирует причину и может увеличить вред.
Сначала проверьте:
- Есть ли официальный API, выгрузка или лицензированный канал данных.
- Разрешён ли нужный путь в
robots.txtи условиях использования. - Не превышаете ли вы опубликованный лимит.
- Можно ли кэшировать результат и убрать повторные запросы.
- Нужна ли страница целиком или достаточно одного публичного endpoint.
Прокси полезны для управляемой сетевой инфраструктуры, географии и разделения рабочих потоков. Они не дают разрешения на доступ и не гарантируют ответ конкретного сайта.
Как проверить гипотезу на своей нагрузке
Сравните прямое соединение, один фиксированный DC и один ISP при одинаковых URL, паузе и параллельности. Считайте 200, 403, 429, CAPTCHA, timeout, p50/p95 и число повторов на успешную запись.
Такой тест показывает поведение выбранной выборки и источника в конкретный период. Он не гарантирует результат на других сайтах или при другой нагрузке.
Этичность и право важнее технической доступности
Собирайте только публичные данные. Уважайте Disallow и Crawl-delay, даже если конкретный клиент технически может их проигнорировать. Не обходите логин, paywall и ограничения доступа. Не собирайте персональные данные без законного основания. Используйте честный User-Agent, кэш, ограниченную параллельность и backoff на 429/503.
Если автоматический доступ запрещён условиями источника, технически успешный запрос не делает сбор допустимым. Для критичного бизнес-процесса согласуйте API, выгрузку или разрешение владельца данных.
Когда переходить на Scraper API
Готовый API имеет смысл, если команда не хочет поддерживать браузеры, очереди повторов и наблюдаемость. Но правила источника и требования к данным остаются вашей ответственностью. Сначала проверьте задачу на разрешённых страницах, затем сравните качество ответа и стоимость.
Посмотреть возможности Scraper API
Ключевые выводы
- CAPTCHA,
403,429и timeout требуют разных действий. 429означает, что нужно замедлиться; учитывайтеRetry-After.- Ротация IP не заменяет разрешение источника и соблюдение лимитов.
- Тест сравнивает режимы только при одинаковой нагрузке и критериях успеха.
- При запрете автоматического доступа выбирайте официальный API или согласованную выгрузку.
Краткий ответ: при CAPTCHA остановите повторы, проверьте правила источника и нагрузку, затем отделите HTTP-ограничение от сетевой ошибки прокси.
Нужна прокси-инфраструктура под вашу нагрузку?
Сравните Datacenter и ISP прокси, протоколы и условия теста перед договором.
Перейти к проксиЧитайте также
Как антибот-защита распознаёт автоматические запросы
Разбираем, как современные системы антибот-защиты обнаруживают скреперы: IP-репутация, TLS-отпечатки, JavaScript-челленджи, поведенческий анализ и fingerprinting устройств.
ТехническоеСтратегии ротации прокси для масштабного веб-скрейпинга
Стратегии ротации прокси: Round-Robin, сессии и маршрутизация. Как выбрать подходящий режим под задачу и контролировать расход адресов.
РуководстваНачало работы со Scraping API: от первого запроса до production
Пошаговое руководство по интеграции API для скрейпинга в ваш проект: выбор провайдера, структура запросов, обработка ответов и масштабирование.