Резидентные прокси Bright Data снижают частоту появления CAPTCHA при массовом парсинге, но не убирают её полностью — часть запросов всё равно упрётся в проверку. CaptchaAI закрывает этот остаток: он решает CAPTCHA на собственной инфраструктуре, а прокси остаётся просто каналом просмотра. Ниже — архитектура связки, код на Python и Node.js и настройки зоны, которые снижают долю CAPTCHA-запросов.
Как связка прокси и CaptchaAI работает на практике
Your Script ──▶ Bright Data Proxy ──▶ Target Site
│
CAPTCHA appears
│
CaptchaAI API ──▶ Solved token
│
Inject token ◀─┘
Важно: запрос на решение CAPTCHA не идёт через ваш прокси-канал — CaptchaAI обращается к целевой странице со своей стороны, по собственной инфраструктуре. Прокси отвечает только за то, чтобы просмотр (заход на страницу, загрузка формы) выглядел как обычный трафик из нужного региона.
Что подготовить перед подключением
Прежде чем писать код, проверьте четыре вещи — большинство сбоев в этой связке сводится именно к ним:
- Аккаунт Bright Data с активной резидентной или ISP-зоной и рабочими учётными данными (customer ID, зона, пароль).
- API-ключ CaptchaAI и понимание, какой тип CAPTCHA встречается на целевом сайте — reCAPTCHA v2, Cloudflare Turnstile или Cloudflare Challenge.
- Закреплённая сессия там, где решается CAPTCHA — токен привязан к IP, и ротация здесь всё сломает.
- Тарифный план CaptchaAI по числу потоков соответствует реальной параллельности парсинга, а не только числу прокси-соединений.
Типы прокси Bright Data и их влияние на частоту CAPTCHA
| Тип | IP-адреса | Скорость | Стоимость | Частота CAPTCHA |
|---|---|---|---|---|
| Дата-центр | 770 тыс.+ | Высокая | Низкая | Выше |
| Резидентный | 72 млн+ | Средняя | Средняя | Ниже |
| ISP | 700 тыс.+ | Высокая | Высокая | Самая низкая |
| Мобильный | 7 млн+ | Низкая | Высокая | Очень низкая |
Диагностика типичных ошибок
Прежде чем настраивать зону, полезно понимать, какие симптомы к какой причине обычно ведут:
- 407 от прокси — неверные учётные данные. Проверьте customer ID, зону и пароль.
- CAPTCHA всплывает почти на каждом запросе — использован дата-центр прокси. Переключитесь на резидентную зону.
- Токен отклонён — IP сменился между решением и отправкой. Используйте закреплённую сессию.
- Медленный ответ — перегружена выходная нода. Таргетируйте менее популярную страну или город.
- Соединение отклонено — достигнут лимит пропускной способности. Проверьте панель управления Bright Data.
Какую зону Bright Data настроить для CAPTCHA-тяжёлых сайтов
Задайте зону Bright Data по пунктам ниже — это само по себе снижает долю запросов, упирающихся в CAPTCHA:
- Тип прокси — резидентный. Самая низкая частота срабатывания CAPTCHA среди всех типов Bright Data.
- Таргетинг по стране — совпадает с локацией целевого сайта. IP и контент страницы должны быть согласованы.
- Тип сессии — закреплённый. Токен CAPTCHA должен соответствовать исходному IP.
- Фильтр качества IP — высокое качество. Меньше уже помеченных IP-адресов в пуле.
- Макс. одновременных соединений — 100+. Нужно для параллельных CAPTCHA-задач.
Интеграция на Python
Ниже — два рабочих варианта: обычные HTTP-запросы через requests и запуск полноценного браузера через Selenium, когда сайту нужен реальный рендеринг страницы.
Запросы + Bright Data + CaptchaAI
Самый простой путь для сайтов, где reCAPTCHA v2 и Turnstile можно решить без запуска браузера — только через прокси-запрос и вызов API CaptchaAI:
import requests
import time
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
# Bright Data proxy credentials
BRIGHT_DATA_PROXY = {
"http": "http://brd-customer-CUSTOMER_ID-zone-ZONE:[email protected]:22225",
"https": "http://brd-customer-CUSTOMER_ID-zone-ZONE:[email protected]:22225",
}
def fetch_with_proxy(url):
"""Fetch a page through Bright Data proxy."""
resp = requests.get(
url,
proxies=BRIGHT_DATA_PROXY,
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/126.0.0.0 Safari/537.36"
},
timeout=30,
)
return resp
def solve_recaptcha(site_url, sitekey):
"""Solve reCAPTCHA v2 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("Solve timeout")
def solve_turnstile(site_url, sitekey):
"""Solve Cloudflare Turnstile via CaptchaAI."""
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": site_url,
"json": 1,
})
data = resp.json()
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":
return data["request"]
raise TimeoutError("Solve timeout")
Selenium + Bright Data + CaptchaAI
Когда сайт требует реального браузера — рендерит виджет через JavaScript или проверяет поведение страницы, — прокси задаётся на уровне драйвера, а решённый токен инжектируется в DOM:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
BRIGHT_DATA_HOST = "brd.superproxy.io"
BRIGHT_DATA_PORT = 22225
BRIGHT_DATA_USER = "brd-customer-CUSTOMER_ID-zone-residential"
BRIGHT_DATA_PASS = "PASSWORD"
def create_driver_with_proxy():
options = webdriver.ChromeOptions()
options.add_argument(
f"--proxy-server=http://{BRIGHT_DATA_HOST}:{BRIGHT_DATA_PORT}"
)
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(options=options)
return driver
def scrape_with_captcha_solving(url, sitekey=None):
driver = create_driver_with_proxy()
try:
driver.get(url)
time.sleep(3)
# Auto-detect sitekey if not provided
if not sitekey:
sitekey = driver.execute_script(
"return document.querySelector('[data-sitekey]')"
"?.getAttribute('data-sitekey')"
)
if sitekey:
token = solve_recaptcha(url, sitekey)
driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
document.querySelectorAll('[name="g-recaptcha-response"]')
.forEach(el => {{ el.value = '{token}'; }});
""")
# Trigger callback
driver.execute_script("""
if (typeof ___grecaptcha_cfg !== 'undefined') {
const clients = ___grecaptcha_cfg.clients;
for (const key in clients) {
for (const prop in clients[key]) {
const val = clients[key][prop];
if (val && typeof val === 'object') {
for (const p in val) {
if (typeof val[p]?.callback === 'function') {
val[p].callback(arguments[0]);
}
}
}
}
}
}
""")
return driver.page_source
finally:
driver.quit()
Таргетинг по стране и городу
Bright Data поддерживает таргетинг на страну, регион и город — используйте его, чтобы IP совпадал с гео целевого сайта:
# Country targeting
proxy_us = "http://brd-customer-ID-zone-residential-country-us:[email protected]:22225"
proxy_uk = "http://brd-customer-ID-zone-residential-country-gb:[email protected]:22225"
proxy_de = "http://brd-customer-ID-zone-residential-country-de:[email protected]:22225"
# City targeting
proxy_nyc = "http://brd-customer-ID-zone-residential-country-us-city-newyork:[email protected]:22225"
# Use the geo-matched proxy for lower CAPTCHA rates
def scrape_localized(url, country="us"):
proxy = f"http://brd-customer-ID-zone-residential-country-{country}:[email protected]:22225"
resp = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=30)
return resp
Для аудитории из СНГ или Восточной Европы часто разумнее задать не одну страну, а несколько соседних — качество резидентного пула по странам неравномерно. И если через прокси вы собираете не разметку, а персональные данные, обрабатывайте только то, что вправе обрабатывать: по 152-ФЗ для аудитории РФ, по GDPR-логике — для трансграничных проектов.
Закреплённая или ротируемая сессия
# Sticky session (same IP for entire session)
proxy_sticky = (
"http://brd-customer-ID-zone-residential"
"-session-abc123:[email protected]:22225"
)
# Rotating (new IP each request)
proxy_rotating = (
"http://brd-customer-ID-zone-residential:[email protected]:22225"
)
Для CAPTCHA-сценариев берите закреплённую сессию. Токен CAPTCHA привязан к IP, с которого загрузилась страница: если между загрузкой и отправкой формы IP сменится на другой (например, при ротации на каждый запрос), токен отклонят. Ротацию имеет смысл включать только для запросов, где CAPTCHA не участвует.
Интеграция на Node.js
Логика та же, что и в Python-версии на requests: прокси подключается через агента, а решённый токен запрашивается опросом res.php.
const axios = require("axios");
const https = require("https");
const CAPTCHAAI_KEY = "YOUR_API_KEY";
const CAPTCHAAI_URL = "https://ocr.captchaai.com";
const proxyAgent = new (require("https-proxy-agent"))(
"http://brd-customer-ID-zone-residential:[email protected]:22225"
);
async function fetchWithProxy(url) {
return axios.get(url, {
httpsAgent: proxyAgent,
headers: {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0.0.0",
},
});
}
async function solveCaptcha(siteUrl, sitekey) {
const submit = await axios.post(`${CAPTCHAAI_URL}/in.php`, null, {
params: {
key: CAPTCHAAI_KEY,
method: "userrecaptcha",
googlekey: sitekey,
pageurl: siteUrl,
json: 1,
},
});
const taskId = submit.data.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get(`${CAPTCHAAI_URL}/res.php`, {
params: {
key: CAPTCHAAI_KEY,
action: "get",
id: taskId,
json: 1,
},
});
if (result.data.request === "CAPCHA_NOT_READY") continue;
if (result.data.status === 1) return result.data.request;
}
throw new Error("Timeout");
}
Частые вопросы
Нужно ли направлять решение CAPTCHA через прокси Bright Data?
Нет, и в этом суть связки. CaptchaAI решает CAPTCHA на собственной инфраструктуре — ваш прокси в этот процесс не вовлечён и им не нагружается. Прокси занят только просмотром: вы передаёте в API CaptchaAI URL страницы и sitekey, а не сам прокси-канал.
Скольких потоков CaptchaAI хватит, если парсинг идёт через ротацию Bright Data на несколько воркеров?
Это зависит не от прокси, а от числа одновременных задач CAPTCHA: BASIC ($15/мес, 5 потоков) хватит на один воркер, ADVANCE ($90/мес, 50 потоков) — на параллельный парсинг. Ротация прокси на пропускную способность CaptchaAI не влияет.
Что делать, если CAPTCHA всё равно появляется через резидентный прокси?
Резидентные IP снижают срабатывание, но не убирают его: проверьте, не проседает ли фильтр качества IP в настройках зоны, и не используется ли ротация там, где нужна закреплённая сессия. Если триггер сохраняется на конкретном сайте, добавьте таргетинг по стране, совпадающей с гео сайта.
Как передать proxy-параметр в CaptchaAI, чтобы решить CAPTCHA с того же IP?
API CaptchaAI принимает параметр proxy — тогда сам сервис решает CAPTCHA с указанного адреса, а не с общей инфраструктуры CaptchaAI. Это нужно для IP-привязанных проверок, где токен иначе не примут.
Как понять, что ошибка вызвана сменой IP между шагами, а не самим прокси?
Если токен отклоняется нерегулярно, чаще при высокой параллельности — почти всегда виновата ротация: IP на загрузке и на отправке разошлись. Закреплённая сессия для CAPTCHA-запросов обычно решает проблему без изменения кода.
Похожие материалы
- Ротация резидентных прокси для решения CAPTCHA
- Почему CAPTCHA чаще ловит браузерную автоматизацию, чем прямой API-запрос
- ISP-прокси против дата-центр прокси: что реже вызывает CAPTCHA
Подключите прокси-сеть Bright Data к автоматическому решению CAPTCHA — оформите API-ключ CaptchaAI и переносите парсинг в продакшн без ручных проверок.