Большинство туториалов «как обойти Cloudflare» в интернете перестали работать в конце 2024 года. Причина не в том, что Cloudflare добавил новые защиты. А в том, что старые защиты — JA3-фингерпринтинг и базовые проверки заголовков — сменились новым поколением, которое ломает любой быстрый трюк. Этот гайд объясняет, что Cloudflare реально проверяет в 2026 году, почему cloudscraper, undetected-chromedriver и большинство «stealth»-плагинов проваливаются, и приводит четырёхслойный рецепт, который всё ещё работает в продакшене.
Честный итог сразу: единого трюка нет. Надёжный обход Cloudflare требует правильного IP, правильного TLS-фингерпринта, правильного порядка HTTP/2-фреймов и (на уровне Bot Management) настоящего браузера. Ошибитесь в любом из этих пунктов — и вы провалите фильтр на границе ещё до того, как ваш запрос дойдёт до origin-сервера.
Детекция ботов в Cloudflare работает как конвейер фильтров на границе сети. Каждый запрос проходит их по порядку. Побеждает самый ранний фильтр, который отклоняет запрос — то есть запрос может провалиться уже на репутации IP, прежде чем будут изучены хоть один фингерпринт или заголовок.
Это первая и самая дешёвая проверка. Cloudflare держит базу с ключом по ASN (Autonomous System Number). ASN известных облачных провайдеров (AWS AS16509, GCP AS15169, Azure AS8075, OVH AS16276, DigitalOcean AS14061, Hetzner AS24940, Vultr AS20473) под максимальным подозрением. Даже с идеальным фингерпринтом браузерного уровня запрос с этих ASN считается виновным, пока не доказано обратное.
Резидентные ASN (Comcast AS7922, Verizon AS701, China Telecom AS4134, BT AS2856) считаются легитимными. Запрос с резидентного IP с топорным Python-фингерпринтом всё равно может пройти, тогда как запрос с дата-центрового IP с идеальным фингерпринтом Chrome получит челлендж или блок.
JA4 — преемник JA3 от 2023 года, выпущенный FoxIO. Он хеширует конкретные поля TLS ClientHello: версию TLS, наборы шифров (по порядку), расширения (по порядку), ALPN-протоколы, алгоритмы подписи и поддерживаемые группы. На выходе — детерминированный фингерпринт вроде t13d1516h2_8daaf6152771_b1ff8ab2d16f.
Настоящий Chrome 124 выдаёт один конкретный JA4. Настоящий Firefox 124 — другой. Python-библиотека requests (использующая urllib3 и OpenSSL) выдаёт JA4, который не эмитит ни один реальный браузер, потому что порядок шифров и список расширений не совпадают ни с Chrome, ни с Firefox. Cloudflare помечает этот паттерн ещё до разбора любого HTTP-заголовка.
Вывод: любая библиотека, использующая системный OpenSSL или штатный Python TLS, детектируема. Сюда входят requests, aiohttp, httpx (дефолтная конфигурация) и любая «обходная» обёртка поверх них.
HTTP/2-соединения несут SETTINGS-фреймы, обновления окна (WINDOW_UPDATE), PRIORITY-фреймы и HEADERS-фреймы. Браузеры отправляют их в определённом порядке с определёнными значениями. Chrome 124 шлёт начальный SETTINGS-фрейм с конкретными значениями, затем WINDOW_UPDATE, затем HEADERS. Python-библиотека httpx с включённым HTTP/2 шлёт другой SETTINGS-пейлоад и пропускает PRIORITY-фреймы, которые включает Chrome.
Порядок псевдозаголовков HTTP/2 тоже выдаёт личность. Chrome шлёт :method, :authority, :scheme, :path именно в таком порядке. Firefox шлёт :method, :path, :authority, :scheme. Большинство библиотек на Python и Go сериализуют их по алфавиту. Cloudflare сверяет порядок с ожидаемым паттерном для заявленного User-Agent и помечает несоответствия.
Заголовки HTTP/1.1 сохраняют порядок вставки. Настоящий Chrome шлёт заголовки в фиксированном порядке: Host, Connection, Cache-Control, sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, Upgrade-Insecure-Requests, User-Agent, Accept, Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-User, Sec-Fetch-Dest, Accept-Encoding, Accept-Language. Python-библиотека requests переупорядочивает их и иногда меняет регистр. Даже ручная установка заголовков в правильном порядке не помогает, потому что нижележащая библиотека их пересортировывает.
Если предыдущие фильтры пройдены, но оценка всё ещё подозрительна, Cloudflare отдаёт JavaScript-челлендж. Скрипт вычисляет токен из значений окружения браузера (хеш canvas, рендерер WebGL, аудиоконтекст, свойства navigator, замеры таймингов) и отправляет его через XHR. Ни один HTTP-клиент это не решит. Нужен настоящий браузер, и браузер должен выглядеть настоящим (никакого navigator.webdriver = true, никаких отсутствующих свойств).
На уровне Bot Management Cloudflare собирает движения мыши, скорость скролла, тайминг кликов и динамику нажатий клавиш через постоянно работающий скрипт. Headless-браузер, который грузит страницу и сразу начинает скрапить, ни разу не двинув мышью, детектируется за секунды. Реальные пользователи двигаются хаотично, делают паузы и перечитывают. Боты скроллят линейно и кликают идеально по пикселям.
Быстрые инструменты, питавшие скрапинг 2021–2024, объединяет один режим отказа: они патчат видимую поверхность, но не нижележащий TLS-стек.
| Инструмент | Что патчит | Почему провалится в 2026 |
|---|---|---|
cloudscraper | Решатель JS-челленджей (legacy) | Cloudflare перешёл на Turnstile в 2023; старые челленджи устарели |
undetected-chromedriver | Патчит флаги утечек Selenium | JA4 всё равно течёт из TLS нижележащего chromedriver; navigator.webdriver — лишь один из 40+ сигналов |
selenium-stealth | Подставляет фейковые JS-свойства | Cloudflare читает из C++-слоя, а не из JS; подмена детектируется как несогласованность |
FlareSolverr | Оборачивает Chromium для разового решения челленджа | cf_clearance привязан к IP решателя; свежий прокси мгновенно аннулирует токен |
Штатный puppeteer-extra-plugin-stealth | Патчит ~17 точек детекции | Cloudflare добавил ~12 новых проверок в 2024–2025, не покрытых плагином |
Паттерн очевиден: инструменты, которые оборачивают настоящий браузер и патчат известные утечки, проигрывают гонку вооружений за месяцы. Инструменты, симулирующие TLS-стек браузера (curl_cffi, tls-client), выжили, потому что сидят ближе к проводу.
Обход, работающий в 2026 году, нуждается во всех четырёх слоях. Пропуск любого из них роняет долю успеха до единиц процентов.
Это безусловное требование для любого сайта на Cloudflare Pro и выше. Фильтр репутации IP отклоняет дата-центровые ASN ещё до завершения TLS-рукопожатия. Используйте резидентный прокси со sticky-сессией минимум на 10 минут, чтобы cookie cf_clearance пережил.
Используйте curl_cffi (Python) или tls-client (Go/Python). Оба линкуются с модифицированным BoringSSL, который несёт точный порядок шифров, список расширений и значения ALPN от Chrome.
from curl_cffi import requests
response = requests.get(
"https://target.com/api/products",
impersonate="chrome124",
proxies={"https": "http://user-session-abc123:[email protected]:10001"},
timeout=30,
)
print(response.status_code, len(response.text))
Параметр impersonate="chrome124" подменяет TLS-стек так, что ClientHello совпадает с Chrome 124 байт в байт. Хеш JA4 будет идентичен настоящей установке Chrome 124. Сочетайте его с резидентным прокси — и вы проходите первые два фильтра.
curl_cffi сам выставляет заголовки в порядке Chrome, когда вы используете impersonate. Если добавляете свои заголовки, дописывайте их в конец, а не вставляйте в середину. Избегайте заголовков, которые настоящий Chrome не отправил бы (например, X-Requested-With при обычной навигации).
Для Accept-Language подгоняйте его под географию прокси. Американский резидентный IP, шлющий Accept-Language: zh-CN,zh;q=0.9, — небольшой, но реальный сигнал. Используйте en-US,en;q=0.9 для американских IP, de-DE,de;q=0.9 для немецких и так далее. Это один из немногих сигналов, который можно поправить бесплатно.
Если цель триггерит Managed Challenge (в теле ответа вы видите страницу челленджа CF), одного curl_cffi мало. Переключайтесь на Playwright с пропатченным Chromium.
from playwright.sync_api import sync_playwright
from rebrowser_playwright.sync_api import sync_playwright as rebrowser_sync
with rebrowser_sync() as p:
browser = p.chromium.launch(
headless=True,
proxy={
"server": "http://gate.jibaoproxy.com:10001",
"username": "user-session-abc123",
"password": "pass",
},
)
context = browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
viewport={"width": 1920, "height": 1080},
locale="en-US",
timezone_id="America/New_York",
)
page = context.new_page()
page.goto("https://target.com/", wait_until="networkidle")
# cf_clearance теперь в context.cookies()
cookies = context.cookies()
cf_clearance = next((c for c in cookies if c["name"] == "cf_clearance"), None)
browser.close()
Используйте rebrowser-playwright вместо штатного playwright. Он патчит утечки CDP-рантайма (Runtime.enable, раскрытие CDP-команд странице), которые Cloudflare читает для детекции headless-автоматизации. После прохождения челленджа извлеките cf_clearance из cookie и передайте его обратно в curl_cffi для основного цикла скрапинга. Браузер нужен один раз на сессию, а не на каждый запрос.
Инстинкт взять самый дешёвый прокси почти всегда ошибочен на сайтах за Cloudflare. Пройдёмся по математике с реальными цифрами.
Допущения: средняя HTML-страница 500 КБ, всего скрапим 100 000 страниц, цель использует Cloudflare Pro с включённым Bot Fight Mode.
| Связка | Стоимость трафика | Доля успеха | Запросов на успех | Итого | Цена за страницу |
|---|---|---|---|---|---|
| Дата-центр $1/GB + requests | $0.0005 / запрос | 0.5% | 200 | $10,000 | $0.10 |
| Дата-центр $1/GB + curl_cffi | $0.0005 / запрос | 3% | 33 | $1,650 | $0.0165 |
| Резидентные $6.8/GB + requests | $0.0033 / запрос | 40% | 2.5 | $825 | $0.0083 |
| Резидентные $6.8/GB + curl_cffi | $0.0033 / запрос | 92% | 1.09 | $360 | $0.0036 |
| Резидентные $6.8/GB + Playwright (rebrowser) | $0.017 / запрос (ассеты + JS) | 96% | 1.04 | $1,700 | $0.017 |
Два вывода, которые стоит отметить:
Это паттерн, который мы рекомендуем клиентам, скрапящим цели за Cloudflare в масштабе. Он минимизирует использование Playwright (медленного и дорогого) и максимизирует использование curl_cffi (быстрого и дешёвого).
from curl_cffi import requests as cf_requests
from rebrowser_playwright.sync_api import sync_playwright
PROXY_USER_FMT = "user-session-{sid}"
PROXY_HOST = "http://gate.jibaoproxy.com:10001"
PROXY_PASS = "your_password"
def get_cf_clearance(target_url, session_id):
"""Разовый вызов Playwright, чтобы решить челлендж и извлечь cf_clearance."""
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,
proxy={"server": PROXY_HOST,
"username": PROXY_USER_FMT.format(sid=session_id),
"password": PROXY_PASS},
)
ctx = browser.new_context(user_agent="Mozilla/5.0 ... Chrome/124.0.0.0 Safari/537.36")
page = ctx.new_page()
page.goto(target_url, wait_until="networkidle", timeout=45000)
cookies = ctx.cookies()
browser.close()
return {c["name"]: c["value"] for c in cookies}
def scrape_with_clearance(urls, session_id, cookies):
"""Переиспользуем один session_id (sticky IP) для всех запросов."""
proxy = f"http://{PROXY_USER_FMT.format(sid=session_id)}:{PROXY_PASS}@gate.jibaoproxy.com:10001"
out = []
for url in urls:
r = cf_requests.get(
url,
impersonate="chrome124",
proxies={"https": proxy},
cookies=cookies,
timeout=30,
)
if r.status_code == 200:
out.append((url, r.text))
elif r.status_code in (403, 503) and "challenge" in r.text.lower():
# cf_clearance истёк; решаем заново
cookies = get_cf_clearance(url, session_id)
r = cf_requests.get(url, impersonate="chrome124",
proxies={"https": proxy}, cookies=cookies)
out.append((url, r.text))
return out, cookies
# Использование
session_id = "scrape-job-2026-05-27"
cookies = get_cf_clearance("https://target.com/", session_id)
results, cookies = scrape_with_clearance(target_urls, session_id, cookies)
Ключевые моменты этого рецепта:
Некоторые развёртывания Cloudflare нельзя обойти за любую разумную цену. Если видите эти сигналы, меняйте стратегию (используйте API, договоритесь с владельцем сайта или купите данные) вместо того, чтобы жечь бюджет на обход, который никогда не стабилизируется.
| Уровень цели | Рецепт | Ожидаемая доля успеха |
|---|---|---|
| CF Free / Pro (без Bot Fight) | Дата-центр + curl_cffi | 60–75% |
| CF Free / Pro + Bot Fight Mode | Резидентные + curl_cffi | 85–93% |
| CF Business | Резидентные + curl_cffi + изредка Playwright | 80–90% |
| CF Business + Turnstile | Резидентные + rebrowser-playwright (каждый запрос) | 70–85% |
| CF Enterprise + Bot Management | Мобильные резидентные + rebrowser + симуляция поведения | 30–60% |
| CF Enterprise + Bot Management + кастомный WAF | Не скрапить; идти через API или партнёрство | <10% |
JIBAO Proxy предлагает динамические резидентные прокси с более чем 90 млн IP в 240+ странах, sticky-сессиями до 60 минут и таргетингом по странам от $6.8/GB. Для мобильных IP см. динамические мобильные прокси. Оба работают из коробки с curl_cffi, tls-client, Playwright, Puppeteer, Selenium и любым HTTP-клиентом, поддерживающим прокси HTTP/SOCKS5.
По теме: Sticky vs ротируемые сессии прокси подробно разбирает настройку сессий. Прокси для AI-агентов объясняет сценарий с AI-агентами, который сильно пересекается с workflow обхода Cloudflare.
Получите $5 бесплатного баланса. Прогоните связку curl_cffi + sticky-резидентные против своей цели, прежде чем вкладываться.
Начать бесплатноНовым пользователям — 5U при регистрации, бонус к первому пополнению. Акция ограничена по времени.