Integrations

Oxylabs + CaptchaAI: интеграция прокси-сервера центра обработки данных

Прокси и решатель CAPTCHA закрывают две разные задачи. Прокси Oxylabs подставляют «чистый» IP и распределяют запросы, но саму проверку reCAPTCHA v2 или Cloudflare Turnstile они не проходят. За эту часть отвечает CaptchaAI: сервис получает sitekey, возвращает токен, а вы вставляете его в форму. Ниже — рабочая связка на Python: как гонять трафик через прокси Oxylabs дата-центра и резидентного пула, удерживать один IP на всю сессию и параллелить парсинг, отдавая CAPTCHA в CaptchaAI.


Какой прокси Oxylabs выбрать под парсинг с CAPTCHA

У Oxylabs пять продуктов, и для парсинга с CAPTCHA разница между ними сводится к одному: как часто цель показывает проверку и сколько вы готовы платить скоростью за «чистоту» IP.

Продукт Пул IP Скорость Когда использовать
Прокси дата-центров 2 млн+ Очень высокая Большой объём, приоритет скорости
Резидентные прокси 100 млн+ Средняя Сайты, чувствительные к CAPTCHA
ISP-прокси Резидентного уровня Высокая E-commerce, соцсети
Мобильные прокси 20 млн+ Низкая Мобильные цели
SERP Scraper API Управляемый сервис Высокая Выдача Google/Bing

Практическое правило простое:

  • Прокси дата-центров — высокая скорость и низкая цена за объём, но подсети легко опознаются, поэтому CAPTCHA прилетает чаще.
  • Резидентные и ISP-прокси — выглядят как обычные пользователи, провоцируют меньше проверок, но стоят дороже и отвечают медленнее.
  • Мобильные и SERP-продукты — нишевые: первые под мобильные цели, второй под готовую выдачу поисковиков.

В связке с CaptchaAI вы можете осознанно смещаться в сторону дата-центра: даже если проверок станет больше, решает их API, а не человек, и экономия на трафике часто перевешивает.

Интеграция на Python

Связка держится на трёх кирпичах, и дальше мы разберём каждый:

  • строка прокси Oxylabs с учётными данными и, при необходимости, суффиксом страны;
  • вызов CaptchaAI: отправка sitekey на in.php и опрос res.php до готового токена;
  • удержание одного IP на всю сессию, чтобы токен и отправка формы шли с одного адреса.

Базовый запрос и решение CAPTCHA

Логика одинакова для всех продуктов Oxylabs: собираете строку прокси вида customer-USERNAME:PASSWORD@endpoint, при необходимости добавляете суффикс страны -cc-us, а когда в ответе встречается sitekey — отправляете его в CaptchaAI и ждёте токен. Функция solve_recaptcha ниже отправляет задачу на in.php, а затем опрашивает res.php раз в пять секунд, пока не вернётся g-recaptcha-response.

import requests
import time

OXYLABS_USER = "customer-USERNAME"
OXYLABS_PASS = "PASSWORD"
OXYLABS_ENDPOINT = "pr.oxylabs.io:7777"

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"

# Residential rotating proxy
proxies = {
    "http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
    "https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
}


def fetch_page(url, country=None):
    """Fetch page through Oxylabs proxy."""
    user = OXYLABS_USER
    if country:
        user += f"-cc-{country}"

    proxy = {
        "http": f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
        "https": f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
    }

    return requests.get(
        url,
        proxies=proxy,
        headers={
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36"
        },
        timeout=30,
    )


def solve_recaptcha(site_url, sitekey):
    """Solve via CaptchaAI."""
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "json": 1,
    })
    data = resp.json()
    if data["status"] != 1:
        raise Exception(f"Submit: {data['request']}")

    task_id = data["request"]

    for _ in range(60):
        time.sleep(5)
        resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        })
        data = resp.json()
        if data["request"] == "CAPCHA_NOT_READY":
            continue
        if data["status"] == 1:
            return data["request"]
        raise Exception(f"Solve: {data['request']}")

    raise TimeoutError("Timeout")

Sticky-сессии: один IP на весь сценарий

Многошаговые сценарии — открыть форму, решить CAPTCHA, отправить данные — ломаются, если IP меняется между запросами: токен привязан к сессии, а ротируемый прокси уже отдал другой адрес. Sticky-сессия Oxylabs фиксирует один IP через суффикс -sessid-. Держите его всё время, пока CaptchaAI решает проверку, и отправляйте токен с того же адреса. В примере запрос идёт на staging-стенд — это правильная рамка: связку удобно обкатать на собственном тестовом окружении, прежде чем выводить в прод.

def get_oxylabs_sticky_proxy(session_id, country=None):
    """Create Oxylabs sticky session (same IP)."""
    user = OXYLABS_USER + f"-sessid-{session_id}"
    if country:
        user += f"-cc-{country}"

    proxy_url = f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}"
    return {"http": proxy_url, "https": proxy_url}


# CAPTCHA workflow with sticky IP
import random, string
session = "".join(random.choices(string.ascii_lowercase, k=8))
proxy = get_oxylabs_sticky_proxy(session, country="us")

# All requests use the same IP
resp = requests.get("https://https://staging.example.com/qa-form", proxies=proxy)
# ... solve CAPTCHA ...
resp = requests.post("https://target.com/submit", proxies=proxy, data={
    "g-recaptcha-response": token,
})

Рендеринг страниц через Oxylabs Web Scraper API

Если цель подгружает форму и sitekey уже в браузере (JavaScript-рендеринг), удобно взять Web Scraper API: Oxylabs возвращает готовый HTML, вы вытаскиваете из него sitekey регуляркой и передаёте в CaptchaAI. Так рендеринг и решение CAPTCHA разнесены по разным сервисам — каждый делает свою часть.

def scrape_with_oxylabs_api(url):
    """Use Oxylabs Web Scraper API for rendering, CaptchaAI for CAPTCHAs."""
    resp = requests.post(
        "https://realtime.oxylabs.io/v1/queries",
        auth=(OXYLABS_USER, OXYLABS_PASS),
        json={
            "source": "universal",
            "url": url,
            "render": "html",
            "browser_instructions": [
                {"type": "wait", "wait_time_s": 3},
            ],
        },
    )

    result = resp.json()
    html = result["results"][0]["content"]

    # Check for CAPTCHA in rendered HTML
    import re
    sitekey_match = re.search(r'data-sitekey="([^"]+)"', html)

    if sitekey_match:
        sitekey = sitekey_match.group(1)
        token = solve_recaptcha(url, sitekey)
        return {"html": html, "captcha_solved": True, "token": token}

    return {"html": html, "captcha_solved": False}

Дата-центр или резидентный прокси под CAPTCHA

Выбор типа прокси стоит закладывать в код, а не переключать вручную. Простая эвристика: чувствительные к проверкам цели уводите на резидентный пул, всё остальное — на дата-центр ради скорости, зная, что редкие CAPTCHA подхватит CaptchaAI.

# Datacenter: Fast but higher CAPTCHA rate
DC_PROXY = {
    "http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@dc.pr.oxylabs.io:10000",
    "https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@dc.pr.oxylabs.io:10000",
}

# Residential: Slower but lower CAPTCHA rate
RES_PROXY = {
    "http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@pr.oxylabs.io:7777",
    "https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@pr.oxylabs.io:7777",
}


def smart_proxy_selection(url, captcha_sensitive=True):
    """Pick proxy type based on target site sensitivity."""
    if captcha_sensitive:
        return RES_PROXY  # Less likely to trigger CAPTCHA
    return DC_PROXY  # Faster, CaptchaAI handles any CAPTCHAs

Параллельный конвейер и потоки CaptchaAI

Парсинг обычно упирается в параллелизм. ThreadPoolExecutor с пятью воркерами обрабатывает пять URL одновременно, каждый — со своей sticky-сессией. Важный момент по стоимости: CaptchaAI тарифицируется по числу одновременных потоков, а не по количеству решений. Пять параллельных задач CAPTCHA — это пять потоков; тарифа BASIC ($15/мес, 5 потоков) хватит на такой конвейер, а при росте нагрузки берите план выше — без доплаты за каждое отдельное решение.

from concurrent.futures import ThreadPoolExecutor, as_completed

def process_url(url):
    session = "".join(random.choices(string.ascii_lowercase, k=8))
    proxy = get_oxylabs_sticky_proxy(session, country="us")

    try:
        resp = requests.get(url, proxies=proxy, timeout=30)

        import re
        match = re.search(r'data-sitekey="([^"]+)"', resp.text)

        if match:
            token = solve_recaptcha(url, match.group(1))
            return {"url": url, "status": "solved"}
        return {"url": url, "status": "no_captcha"}

    except Exception as e:
        return {"url": url, "status": "error", "error": str(e)}


urls = ["https://site1.com", "https://site2.com", "https://site3.com"]

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = {executor.submit(process_url, u): u for u in urls}
    for future in as_completed(futures):
        print(future.result())

Диагностика типичных ошибок

Симптом Причина Что делать
403 от прокси IP в чёрном списке Перейти на резидентный пул или включить ротацию
Ошибка аутентификации Неверная конечная точка Дата-центр: dc.pr.oxylabs.io:10000, резидентный: pr.oxylabs.io:7777
Sticky-сессия «отваливается» По умолчанию адрес держится ~10 мин Сгенерировать новый ID сессии
CAPTCHA на каждой странице IP дата-центра опознан Переключиться на резидентный или ISP-пул
Медленный ответ Задержка резидентной сети Заложить запас по тайм-ауту или взять ISP-прокси

Задержки, регионы и данные

Резидентный трафик почти всегда медленнее дата-центра — при выходе через дальние узлы к времени решения CAPTCHA добавляется сетевой RTT. Что стоит заложить в конфигурацию заранее:

  • Точка выхода ближе к цели. Командам, которые деплоят парсеры в европейских регионах или в Центральной Азии, разумнее выбирать выходной узел прокси рядом с целевым сайтом.
  • Запас по тайм-аутам. В примере — 30 с на запрос и до 5 минут на решение; для нестабильной мобильной сети запас лучше увеличить.
  • Законность сбора. Собирайте только то, что вправе обрабатывать. Для проектов под 152-ФЗ или GDPR это ответственность вашей стороны — прокси и решение CAPTCHA не снимают обязанности следить за легальностью данных.

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

Нужны ли резидентные прокси, если CAPTCHA всё равно решает CaptchaAI?

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

Почему прокси дата-центра ловит CAPTCHA почти на каждой странице?

Подсети дата-центров опознаются по ASN и попадают в списки. Это нормально: либо переходите на резидентный или ISP-пул, либо оставляете дата-центр и полагаетесь на решение через CaptchaAI.

Как не потерять IP в середине сценария?

Используйте sticky-сессию Oxylabs (суффикс -sessid-). По умолчанию адрес держится около 10 минут — этого хватает на цикл «форма → решение CAPTCHA → отправка». Для длинных сценариев обновляйте ID сессии заранее.

Сколько потоков CaptchaAI заложить под параллельный парсинг?

Ровно столько, сколько задач CAPTCHA идёт одновременно. Пять параллельных воркеров — пять потоков; тариф BASIC ($15/мес, 5 потоков) покрывает такой пример, дальше масштабируйте по числу воркеров.

Решает ли Oxylabs CAPTCHA сам?

Web Scraper API справляется с частью JavaScript-челленджей, но CAPTCHA не решает. reCAPTCHA v2, Cloudflare Turnstile и прочие типы отдавайте в CaptchaAI.


Похожие руководства


Свяжите прокси-инфраструктуру Oxylabs с решением CAPTCHA от CaptchaAI — получите API-ключ.

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