Один и тот же 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
Рекомендации по эксплуатации
- Подбирайте гео прокси под целевой рынок.
Для сайтов из США логичнее брать прокси из США — так меньше расхождений в гео-таргетированном контенте и ниже шанс, что проверка сработает из-за несовпадения геолокации и языка запроса.
- Один прокси — одна сессия.
Не переиспользуйте сессию на разных IP: смена адреса посреди одной сессии выглядит для сайта аномалией и почти всегда возвращает CAPTCHA или сброс сессии.
- Ограничивайте частоту на прокси.
5–10 запросов в минуту на один IP — безопасный ориентир для большинства сайтов; для чувствительных целей вроде поисковых систем берите нижнюю границу диапазона.
- Считайте долю CAPTCHA по каждому прокси.
Убирайте из ротации адреса, которые срабатывают заметно чаще среднего по пулу, — такой адрес, скорее всего, уже частично «прогорел» и тянет вниз всю пачку.
- Держите закреплённые сессии там, где токен привязан к IP.
Как в сценарии с Turnstile выше — один и тот же прокси должен обслуживать весь путь от получения токена до его использования, иначе проверка не пройдёт.
- Настраивайте повтор на другом прокси при обрыве соединения.
Повтор с того же адреса почти всегда упирается в ту же причину сбоя и только ускоряет блокировку — переключение прокси при повторной попытке должно быть в коде по умолчанию.
Мониторинг ротации в проде
Ротацию мало настроить один раз — пул прокси нужно наблюдать в динамике, иначе деградация «прогоревших» адресов останется незаметной до массового всплеска 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 выше.