Use Cases

Ротация прокси для парсинга CAPTCHA

Один и тот же IP отправляет несколько десятков запросов подряд — и сайт начинает показывать CAPTCHA почти на каждой странице. Ротация прокси решает это на уровне трафика: запросы расходятся по разным IP, паттерн перестаёт выглядеть подозрительно, а CaptchaAI закрывает через API те проверки, что всё же проскакивают. Результат — стабильный конвейер сбора данных без ручного решения капч.

Какие прокси выбрать для парсинга

Прокси отличаются не только ценой, но и тем, как часто на них триггерится CAPTCHA:

Тип прокси Подходит для Частота CAPTCHA Стоимость
Резидентный Ценные цели (Google, Amazon) Минимальная $$$
Мобильный Максимально низкое обнаружение Минимальная $$$$
ISP/статический Долгие сессии Низкая $$
Дата-центр Высоконагруженные и слабо защищённые сайты Выше среднего $

Рекомендация. Для сайтов с агрессивным анти-бот триггером берите резидентные прокси; для менее защищённых ресурсов хватает дата-центровских адресов — дешевле и быстрее. Команды из России, Беларуси и Казахстана часто держат воркеры парсинга в европейских дата-центрах — учитывайте это при подборе гео прокси. Если среди данных есть персональные, собирайте только то, что вправе обрабатывать (152-ФЗ, GDPR для трансграничных команд).

Почему ротация IP снижает срабатывания CAPTCHA

Сайты запускают проверку CAPTCHA, ориентируясь на паттерн запросов с одного IP:

Фактор Один IP Ротация прокси
Запросов в минуту 10+ — и CAPTCHA почти гарантирована Нагрузка распределена по пулу адресов
Репутация IP Падает со временем Свежие адреса из пула
Паттерн сессии Виден подозрительный ритм запросов Ритм размыт между IP
География Один регион Естественное географическое разнообразие

Базовая ротация прокси на Python

import requests
import random
import time

PROXIES = [
    "http://user:[email protected]:8080",
    "http://user:[email protected]:8080",
    "http://user:[email protected]:8080",
]

API_KEY = "YOUR_API_KEY"

def get_random_proxy():
    proxy = random.choice(PROXIES)
    return {"http": proxy, "https": proxy}

def scrape_with_rotation(url):
    proxy = get_random_proxy()
    session = requests.Session()
    session.proxies = proxy
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    })

    resp = session.get(url)

    # If CAPTCHA appears, solve it
    if "g-recaptcha" in resp.text or "captcha" in resp.text.lower():
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(resp.text, "html.parser")
        rc = soup.find("div", class_="g-recaptcha")
        if rc:
            site_key = rc["data-sitekey"]
            token = solve_captcha(site_key, url)
            resp = session.post(url, data={"g-recaptcha-response": token})

    return resp.text

def solve_captcha(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": site_key, "pageurl": page_url
    })
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)
    raise TimeoutError()

Умная ротация: приоритет прокси с меньшей долей CAPTCHA

Простой случайный выбор — не предел: ведите счёт CAPTCHA и чистых проходов по каждому прокси и отдавайте предпочтение тем, что реже срабатывают:

from collections import defaultdict
import random

class SmartProxyRotator:
    def __init__(self, proxies):
        self.proxies = proxies
        self.captcha_count = defaultdict(int)
        self.success_count = defaultdict(int)

    def get_proxy(self):
        # Prefer proxies with lower CAPTCHA rates
        scored = []
        for proxy in self.proxies:
            total = self.captcha_count[proxy] + self.success_count[proxy]
            if total == 0:
                score = 0.5  # Unknown proxy, neutral score
            else:
                score = self.success_count[proxy] / total
            scored.append((proxy, score))

        # Weight selection by score
        scored.sort(key=lambda x: x[1], reverse=True)
        top_proxies = scored[:max(len(scored) // 2, 1)]
        proxy = random.choice(top_proxies)[0]
        return proxy

    def report_success(self, proxy):
        self.success_count[proxy] += 1

    def report_captcha(self, proxy):
        self.captcha_count[proxy] += 1

# Usage
rotator = SmartProxyRotator(PROXIES)

def scrape(url):
    proxy = rotator.get_proxy()
    resp = requests.get(url, proxies={"http": proxy, "https": proxy})

    if "captcha" in resp.text.lower():
        rotator.report_captcha(proxy)
        # Solve CAPTCHA...
    else:
        rotator.report_success(proxy)

    return resp.text

Ротация прокси в Selenium

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def create_driver_with_proxy(proxy_url):
    options = Options()
    options.add_argument(f"--proxy-server={proxy_url}")
    options.add_argument("--disable-blink-features=AutomationControlled")
    return webdriver.Chrome(options=options)

# Rotate proxy per session
proxy = random.choice(PROXIES)
driver = create_driver_with_proxy(proxy)
driver.get("https://example.com")

Прокси и решение Cloudflare Turnstile

Для Cloudflare Turnstile прокси передаётся прямо в запрос к CaptchaAI — иначе токен и cookie окажутся привязаны к разным IP:

proxy = "http://user:[email protected]:8080"

resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "turnstile",
    "pageurl": "https://example.com",
    "proxy": proxy,
    "proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]

# Poll for qa_validation_cookie cookie
# Use the same proxy for subsequent requests

Рекомендации по эксплуатации

  1. Подбирайте гео прокси под целевой рынок.

Для сайтов из США логичнее брать прокси из США — так меньше расхождений в гео-таргетированном контенте и ниже шанс, что проверка сработает из-за несовпадения геолокации и языка запроса.

  1. Один прокси — одна сессия.

Не переиспользуйте сессию на разных IP: смена адреса посреди одной сессии выглядит для сайта аномалией и почти всегда возвращает CAPTCHA или сброс сессии.

  1. Ограничивайте частоту на прокси.

5–10 запросов в минуту на один IP — безопасный ориентир для большинства сайтов; для чувствительных целей вроде поисковых систем берите нижнюю границу диапазона.

  1. Считайте долю CAPTCHA по каждому прокси.

Убирайте из ротации адреса, которые срабатывают заметно чаще среднего по пулу, — такой адрес, скорее всего, уже частично «прогорел» и тянет вниз всю пачку.

  1. Держите закреплённые сессии там, где токен привязан к IP.

Как в сценарии с Turnstile выше — один и тот же прокси должен обслуживать весь путь от получения токена до его использования, иначе проверка не пройдёт.

  1. Настраивайте повтор на другом прокси при обрыве соединения.

Повтор с того же адреса почти всегда упирается в ту же причину сбоя и только ускоряет блокировку — переключение прокси при повторной попытке должно быть в коде по умолчанию.

Мониторинг ротации в проде

Ротацию мало настроить один раз — пул прокси нужно наблюдать в динамике, иначе деградация «прогоревших» адресов останется незаметной до массового всплеска CAPTCHA:

  • Доля CAPTCHA на прокси — какой процент запросов через конкретный адрес закончился проверкой; резкий рост — сигнал выводить IP из пула.
  • Доля ошибок 403/429 — рост этих кодов обычно предшествует полной блокировке адреса, а не идёт с ней одновременно.
  • Задержка ответа по прокси — резкое замедление часто означает, что провайдер сети уже придерживает трафик с этого адреса.
  • Возраст IP в пуле — свежие адреса статистически чище; регулярное обновление самого пула не менее важно, чем ротация запросов внутри него.

Достаточно простого лога или таблицы с этими цифрами по каждому прокси — так деградация пула становится видна за дни до того, как CAPTCHA начнёт появляться на каждом втором запросе.

Типичные проблемы и решения

Проблема Решение
CAPTCHA срабатывает на всех прокси Переходите на резидентные IP; снижайте частоту запросов
Прокси стабильно уходит в таймаут Уберите медленные адреса из пула; увеличьте timeout
Контент отличается в зависимости от прокси Сайт отдаёт гео-таргетированный контент — нормализуйте на своей стороне
Токен CAPTCHA не принимается вместе с прокси Убедитесь, что токен получен и используется с одного и того же IP/сессии

Часто задаваемые вопросы

Нужны ли прокси, если я уже подключил CaptchaAI?

Не обязательно — CaptchaAI решает CAPTCHA независимо от IP-адреса. Но без ротации частота проверок растёт по мере того, как «прогорает» адрес, а вместе с ней растут расходы на API и время ожидания ответа.

Сколько прокси нужно для стабильного парсинга 1000+ страниц в день?

Обычно достаточно 10–20 ротируемых резидентных прокси. Для больших объёмов проще подключить провайдера с автоматической ротацией и пулом на несколько тысяч IP, чем управлять списком вручную.

Можно ли использовать бесплатные публичные прокси?

На практике нет: они почти всегда уже засвечены и массово блокируются, поэтому CAPTCHA на них появляется чаще, чем вообще без прокси. Для продакшена нужен платный пул с ротацией и контролем качества IP.

Как понять, что прокси уже в бан-листе целевого сайта?

Если через адрес растёт доля ошибок 403/429 или CAPTCHA появляется заметно чаще среднего по пулу — исключите IP из ротации. Ведите счётчик по каждому прокси, как в SmartProxyRotator выше.

Связанные материалы

Комментарии для этой статьи отключены.