Selenium спалится за 3 секунды

Если вы пытались спарсить сайт на Cloudflare через Selenium или Playwright и упёрлись в бесконечный «Verify you are human» — дело не в вашем коде. Дело в том, что Cloudflare палит автоматизацию браузера ещё до того, как отработает первая строчка JS‑скрипта.

Что на самом деле проверяет Cloudflare

Большинство думает, что Cloudflare анализирует поведение — движения мыши, скорость скролла. Это не так, точнее — не главное. Первый и самый жёсткий фильтр — это TLS‑отпечаток (JA3) и HTTP/2-отпечаток запроса, снятые ещё на этапе рукопожатия, до того как сервер отдал хоть байт HTML.

У requests, urllib, httpx — свой, «питоновский» TLS‑отпечаток. У headless Chrome, даже настоящего, есть свои маркеры: navigator.webdriver, порядок и набор TLS‑расширений, CDP‑биндинги, которые Cloudflare Bot Management распознаёт пачками. Отпечаток не совпадает с отпечатком живого Chrome у живого пользователя — вы получаете челлендж‑страницу вместо контента.

Пример 1: Selenium (не сработает)

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.cat.com/")
h2 = driver.find_element(By.TAG_NAME, "h2").text
print(h2)
driver.quit()

Результат — не текст H2, а "Just a moment..." или зависание на проверке. Даже настоящий Chrome под управлением Selenium несёт маркеры автоматизации на уровне CDP‑протокола, и Cloudflare Bot Management отличает его от живого браузера ещё до рендера страницы.

Пример 2: curl_cffi (сработает)

from curl_cffi import requests
from bs4 import BeautifulSoup
r = requests.get("https://www.cat.com/", impersonate="chrome124")
soup = BeautifulSoup(r.text, "html.parser")
print(soup.find("h2").text.strip())

# output - AFRICA & MIDDLE EAST

curl_cffi — обёртка над curl-impersonate, которая на уровне сокета воспроизводит TLS/JA3 и HTTP/2 отпечаток реального Chrome. Никакого браузера, никакого рендеринга JS, никакого челленджа — сервер видит рукопожатие, неотличимое от настоящего пользователя, и отдаёт страницу напрямую.

Методы применения curl_cffi

  • impersonate= — выбор личности браузера (chrome110chrome124edge99safari15_3 и так далее). Именно этот параметр подменяет TLS/JA3 и HTTP/2 отпечаток.

  • Session() — держит один и тот же отпечаток и куки на серии запросов. Cloudflare следит за консистентностью сессии — рваные identity между запросами тоже палево.

  • proxies= — работает так же, как в requests; для устойчивого скрапинга нужны ротируемые резидентские прокси, TLS‑маскировка одна их не заменяет.

  • Порядок заголовков — curl_cffi сохраняет реальный регистр и порядок заголовков браузера, а не алфавитную сортировку requests, которая сама по себе является меткой бота.

  • AsyncSession — асинхронный клиент для параллельного сбора без потери отпечатка на каждом потоке.

Где брать цели для тренировки

Cloudflare стоит не только перед cat.com — список сайтов на Cloudflare для практики: trends.builtwith.com/websitelist/Cloudflare.

Удачного парсинга!

Комментарии (10)


  1. CrazyElf
    25.08.2026 04:57

    А всё-таки в Selenium это никак нельзя встроить? Очень надо ))


    1. Xokare
      25.08.2026 04:57

      Можно в playwright

      https://github.com/Kaliiiiiiiiii-Vinyzu/patchright

      Селенум не люблю, но для него есть

      https://github.com/ultrafunkamsterdam/undetected-chromedriver


    1. Sprav77
      25.08.2026 04:57

      Undetected_chrome_driver вам пригодится)


      1. Maxim-Safianov Автор
        25.08.2026 04:57

        Пробовал на https://www.teacherspayteachers.com/ за клаудом с жесткой антибот политикой. Палится. Натыкаюсь на каптчу


  1. northrop
    25.08.2026 04:57

    Интересно, а как n8n и прочая ИИшница может помочь преодолевать этот самый бот-чек?


    1. Xokare
      25.08.2026 04:57

      Там всё на основе фингерпринтинга и скоринга. Плохой браузер - отлуп, плохой айпишник - отлуп или капча. ИИ тут как телеге пятое колесо


      1. jorgvonfrundsberg
        25.08.2026 04:57

        Браузер может быть вполне нативный, айпи - тоже хороший, с него у юзера ничего, окромя галки на капче не просят, никаких велосипедов, лестниц и гидрантов. Какой локальный ИИ мог бы тут помочь?


  1. TUYU
    25.08.2026 04:57

    Пара уточнений к транспортной части, обе из документации

    impersonate="chrome124" лучше заменить на impersonate="chrome" - в curl_cffi это алиас на актуальную версию, он обновляется вместе с библиотекой. Пинить конкретную версию есть смысл только там, где нужна воспроизводимость замера: фингерпринт Chrome 124 при живом Chrome 14x сам по себе аномалия - старый браузер, который почему-то ходит по интеу)

    Второе, менее заметное как мне каж. r.status_code == 200 не значит, что вы получили страницу. Cloudflare документирует ровно один надёжный признак челленджа: заголовок cf-mitigated: challenge, он присутствует независимо от типа челленджа, и content-type у челленджа всегда text/html. Статус-код при этом ни к чему не привязан. Без такой проверки success rate парсера считается по страницам-заглушкам, и чем лучше работает impersonate, тем незаметнее ошибка
    https://developers.cloudflare.com/cloudflare-challenges/challenge-types/challenge-pages/detect-response/


  1. ray_qwer
    25.08.2026 04:57

    Год назад успешно сработал просто Firefox через playwright. Но возможно headless отключал (точно не помню). Перед этим потратил пару дней на попытки прикрутить всяких анти-бот плагины к хромиуму


    1. Maxim-Safianov Автор
      25.08.2026 04:57

      За год очень многое изменилось