Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)

Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)

При автоматизации сбора данных с сайтов неизбежно сталкиваешься с антибот-фильтрами. Ресурсы ограничивают частые запросы по IP, бросают на проверку капчами или включают дополнительные барьеры. Ниже - практический разбор того, как настроить Python-парсер, чтобы проходить такие проверки.

Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)

Два базовых подхода к парсингу без проблем, которые ускоряют парсинг на Python

По опыту, рабочих стратегий немного; без тяжёлой R&D вы упрётесь в два проверенных метода:

1. Использовать пул прокси и регулярно менять IP.

2. Подключить сторонний сервис распознавания капчb (например, 2Captcha или SolveCaptcha).

Парсинг и блокировки: не только капча мешает парсить ресурсы

Парсинг - это автоматическое извлечение данных со страниц. В Python обычно берут requests для HTTP и парсеры HTML (например, BeautifulSoup). Но "голого" requests мало, если сайт защищается.

Частые симптомы:

  • IP-бан/троттлинг: слишком много обращений с одного адреса → HTTP 429, редирект на проверку и т.п.
  • CAPTCHA: “I’m not a robot”, распознавание искаженного текста, интерактивные задания.

Бывает и "тихий" облом - сервер отвечает пустыми страницами, парсер "молотит воздух", а результата нет. Разбираемся, как это предотвратить.

Ротация прокси вместо постоянного решения капч

Зачем прокси? Масштабный сбор данных без смены IP быстро палится: один адрес - много запросов - блок. Пул прокси распределяет трафик, снижая риск детекта. На серьезных объемах парсинг без прокси - проигрышная стратегия.

Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)

Какие прокси выбрать?

Бесплатные пулы прокси есть, но они часто медленные и нестабильные. Для нормальных задач берут платные (дата-центр, резидентные, мобильные) - меньше шансов нарваться на "грязные" адреса, выше скорость и аптайм.

Как это выглядит в Python

import itertools import requests # Мини-пул прокси: http/https/socks5 - допустимы. Можно с авторизацией. PROXIES = [ {"http": "http://111.222.33.44:8080", "https": "http://111.222.33.44:8080"}, {"http": "http://user:pass@55.66.77.88:3128", "https": "http://user:pass@55.66.77.88:3128"}, # {"http": "socks5://127.0.0.1:9050", "https": "socks5://127.0.0.1:9050"}, ] proxy_cycle = itertools.cycle(PROXIES) url = "https://httpbin.org/ip" for i in range(3): proxy = next(proxy_cycle) try: r = requests.get(url, proxies=proxy, timeout=(5, 10)) print(f"{i+1}) via {proxy['http']} -> {r.json()}") except requests.RequestException as e: print(f"{i+1}) via {proxy['http']} failed: {e}")

На практике пул "выгорает" - часть адресов падает или блокируется. Значит, нужен регулярный хелсчек и/или поставщик с авто-ротацией.

Как это выглядит в Python

import itertools import requests # Мини-пул прокси: http/https/socks5 - допустимы. Можно с авторизацией. PROXIES = [ {"http": "http://111.222.33.44:8080", "https": "http://111.222.33.44:8080"}, {"http": "http://user:pass@55.66.77.88:3128", "https": "http://user:pass@55.66.77.88:3128"}, # {"http": "socks5://127.0.0.1:9050", "https": "socks5://127.0.0.1:9050"}, ] proxy_cycle = itertools.cycle(PROXIES) url = "https://httpbin.org/ip" for i in range(3): proxy = next(proxy_cycle) try: r = requests.get(url, proxies=proxy, timeout=(5, 10)) print(f"{i+1}) via {proxy['http']} -> {r.json()}") except requests.RequestException as e: print(f"{i+1}) via {proxy['http']} failed: {e}")

На практике пул "выгорает" - часть адресов падает или блокируется. Значит, нужен регулярный хелсчек и/или поставщик с авто-ротацией.

Важно: Прокси сокращают частоту появления капчи, но не исключают её полностью. На сложных сайтах капча всё равно всплывёт.

Виды CAPTCHA и почему их их может быть сложно распознать

Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)

CAPTCHA - это "машиноустойчивые" задания. Основные типы:

  • Текстовые картинки. Искаженные символы на шумном фоне. Легкие решает OCR, но современные варианты сильно усложнены.
  • Google reCAPTCHA v2. Либо чекбокс + возможные картинки, либо “invisible” режим с фоновым анализом поведения.
  • Google reCAPTCHA v3. Вообще без кликов: скрипт присваивает "оценку надёжности" 0.0–1.0; низкий балл → дополнительная проверка/блок.
  • hCaptcha и FunCaptcha (Arkose Labs). Похожие на reCAPTCHA по идее, но со своими нюансами. FunCaptcha часто даёт интерактивные мини-пазлы.
  • Иные механики. GeeTest (слайдер-пазл), клики по координатам, аудио-капчи, "матешки" и др.

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

Две стратегии против капч

1. Минимизировать появление капчи:

  • снижайте частоту запросов;

  • ротуйте IP;

  • варьируйте User-Agent;

  • добавляйте рандомные задержки и "человечий" порядок действий;

  • учитывайте robots.txt;

  • сохраняйте cookies между запросами.

Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)

2. Решать капчи автоматически:

Если капча всё же случилась, отправляем задачу в внешний сервис. Гибрид "нейросети + люди" закрывает почти все типы: простое - мгновенно ИИ, сложное - операторы. Время - от пары секунд до нескольких десятков; каждая капча - это небольшой платёж.

Практика: решение капчи - это всегда задержка и деньги. Поэтому стратегия такая - в приоритете стараемся избегать появление капчи, а если избежать не удается - подключаем сервис распознавания капчи, как план B.

Текстовые капчи (картинка → текст)

Задача: из изображения достать строку.

Варианты:

  • Пробовать OCR (например, tesseract через pytesseract) - подходит только для очень простых картинок.
  • Отдать картинку на внешний API (2Captcha / SolveCaptcha) и получить готовую строку.

Интеграция на Python - пример распознавания текстовой капчи в реализации на Python

Ключи читаем из окружения, чтобы не хранить их в коде.

import os from twocaptcha import TwoCaptcha API_KEY_2CAPTCHA = os.getenv("TWOCAPTCHA_API_KEY") # экспортируйте заранее: export TWOCAPTCHA_API_KEY=xxxxx solver = TwoCaptcha(API_KEY_2CAPTCHA, defaultTimeout=70) res = solver.normal("captcha.jpg") # путь к файлу либо bytes/base64 print("CAPTCHA text:", res["code"])

Аналогично с SolveCaptcha:

import os from solvecaptcha import SolveCaptcha API_KEY_SOLVE = os.getenv("SOLVECAPTCHA_API_KEY") # export SOLVECAPTCHA_API_KEY=xxxxx client = SolveCaptcha(API_KEY_SOLVE) res = client.image("captcha.jpg") print("CAPTCHA text:", res["code"])

Если картинка рождается в браузере, сделайте скрин нужного элемента через Selenium/Playwright, преобразуйте в base64 - и отправляйте.

reCAPTCHA v2 (Google): практический сценарий для распознавания капчи на Python

Нужно получить токен g-recaptcha-response, как будто пользователь прошёл проверку.

Что передаём сервису: sitekey (берётся со страницы) и pageurl. Для невидимой версии - параметр invisible. При необходимости - прокси, чтобы решение и запрос шли "с одного мира".

Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)

Современные эндпоинты:

  • Создать задачу: createTask
  • Проверять результат: getTaskResult

Библиотеки берут это на себя:

import os from twocaptcha import TwoCaptcha solver = TwoCaptcha(os.getenv("TWOCAPTCHA_API_KEY"), defaultTimeout=120, proxy={ "type": "HTTPS", "uri": "login:password@123.45.67.89:3128" }) result = solver.recaptcha(sitekey="SITE_KEY_ИЗ_DOM", url="https://target.example/page", invisible=1) token = result["code"] print("reCAPTCHA v2 token:", token)

Почему важен прокси: многие интеграции валидируют, что токен выдан "тем же" IP/регионом. Если сайт ждёт Германию, а токен появился из Франции, сервер может его не принять.

Как применить токен:

  • В requests - передайте g-recaptcha-response=token в POST-данных.
  • В Selenium - вставьте токен в #g-recaptcha-response и выполните нужный callback/submit.

Решение reCAPTCHA v3 и распознавание Cloudflare Turnstile

reCAPTCHA v3: капча невидима, сервер ожидает валидный токен с определённым "баллом". В задаче указывают версию (v3) и желаемый минимум. Имейте в виду: если сайт просит высокий порог (например, 0.9), токен с меньшим баллом могут не принять - тогда помогает поведенческая имитация в реальном браузере.

Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)

Turnstile (Cloudflare): по логике близка к v3; токен приходит в cf-turnstile-response. Поддерживается обеими сервисами. Процесс тот же: создаём задачу, получаем токен, отправляем вместе с формой или внедряем в браузере.

Обход hCaptcha и распознавание FunCaptcha (Arkose Labs)

hCaptcha: похоже на reCAPTCHA, но со своими правилами. Часто требуется строгая привязка к IP - прокси лучше указывать сразу. В 2Captcha есть режим без прокси, но он подходит не везде.

Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)
import os from twocaptcha import TwoCaptcha solver = TwoCaptcha(os.getenv("TWOCAPTCHA_API_KEY")) res = solver.hcaptcha(sitekey="HCAPTCHA_SITEKEY", url="https://target.example/page") token = res["code"] print("hCaptcha token:", token)

FunCaptcha (Arkose): интерактивные мини-игры. Для решения понадобятся public_key, svc_url, а иногда и blob с зашифрованными данными со страницы. Обязательна прокси-связка, иначе валидация по IP "зарежет" токен.

from twocaptcha import TwoCaptcha import os solver = TwoCaptcha(os.getenv("TWOCAPTCHA_API_KEY"), proxy={ "type": "HTTPS", "uri": "login:password@203.0.113.10:8000" }) res = solver.funcaptcha( sitekey="ARKOSE_PUBLIC_KEY", url="https://target.example/page", s_url="https://client-api.arkoselabs.com", data={"blob": "BASE64_OR_JSON_BLOB_IF_REQUIRED"} ) print("FunCaptcha token/session:", res)

Как обойти Капчи с кликами, координатами, слайдерами (GeeTest и др.)

Некоторые проверки просят кликнуть по объекту на картинке или "дотащить" пазл до выреза.

Парсинг на Python: как обходить антибот-защиту (ротация прокси, сервисы решения капч)

Подходы:

  • Отдаём задачу сервису → получаем координаты кликов или набор значений для валидации.
  • Пробуем CV/ML руками - дорого по времени, нестабильно на проде.

Click-CAPTCHA: 2Captcha принимает изображение и возвращает координаты для кликов.

GeeTest: либо возвращают валидирующие ключи (validate, challenge, и т.д.), либо эмулируют движения слайдера. Для интеграции нужны параметры со страницы (gt, challenge и пр.), затем - подстановка ответа и продолжение сценария.

Полезные Python-библиотеки

  • 2captcha-python - официальный клиент 2Captcha, поддерживает типы капч, прокси, async, регулярно обновляется.
  • solvecaptcha-python - клиент SolveCaptcha: reCAPTCHA, hCaptcha, FunCaptcha, Turnstile, GeeTest и др. Синтаксис близок к 2Captcha.
  • captcha_solver (RuCaptcha/2Captcha) - альтернативный клиент.
  • 2captcha-solver - сторонний модуль с упором на reCAPTCHA/hCaptcha/FunCaptcha, в т.ч. асинхронно.
  • captchatools - мультисервисный клиент: можно настроить основной и резервные сервисы; если баланс кончился или задача "залипла", переключит провайдера.
  • twocaptcha-extension-python - интеграция с Selenium/Playwright: решает капчи прямо в браузере по API-ключу.

Кроме Python, есть официальные/сообщественные SDK на другие языки и браузерные расширения - иногда это самый быстрый путь для прототипа.

Итоги

Чтобы парсер уверенно проходил антибот-защиту, соблюдайте три принципа:

1. Маскировка активности: прокси-пул, ротация User-Agent, паузы, порядок действий.

2. Поведенческая правдоподобность: куки/сессии, не лезть в запрещённые зоны, не спамить.

3. План B на капчи: интегрируйте сервис решения (через современные createTask/getTaskResult), закладывайте таймауты и ретраи.

Следуя этим шагам, вы получите устойчивый пайплайн, который работает даже на "капризных" сайтах.

Начать дискуссию