Wykryty headless browser: przyczyny i poprawki (2026)
Strona zgłasza „headless browser detected” albo po cichu pokazuje twojej zautomatyzowanej przeglądarce inną treść. Strony tak robią, bo headless browser działa bez okna i często różni się od zwykłej przeglądarki na komputerze w drobnych, mierzalnych szczegółach. Ten przewodnik wyjaśnia, na jakie sygnały patrzą strony, jak sprawdzić, co twoja przeglądarka ujawnia, i jak wygląda rozsądna poprawka. Opisuje też moment, w którym właściwą odpowiedzią jest zatrzymanie się albo potraktowanie tego sprawdzenia jako kroku captcha.
Dlaczego strony sprawdzają headless browsery
Narzędzia do automatyzacji sterują prawdziwym silnikiem przeglądarki, więc większość strony działa tak samo. Różnice pojawiają się na brzegach:
- Flagi automatyzacji. Przeglądarki sterowane narzędziami do automatyzacji historycznie udostępniały właściwość
navigator.webdriverustawioną natrue, a niektóre frameworki zostawiają inne ślady na stronie. - Brakujące lub dziwne funkcje przeglądarki. Wersja headless może nie zgłaszać żadnych wtyczek, mieć nietypową listę języków albo rozmiar okna, który nie pasuje do prawdziwego ekranu.
- Różnice w renderowaniu. Wynik canvas i WebGL może się różnić między środowiskiem headless a z oknem, zwłaszcza na serwerze bez GPU.
- Czas. Zautomatyzowane kliknięcia i ładowania stron często mają rytm, którego żaden człowiek by nie wygenerował.
- Zachowanie sieci. Nagłówki żądań, ich kolejność i uścisk dłoni TLS mogą zdradzić klienta, który nie jest przeglądarką.
Strony łączą te sygnały w wynik. Niski wynik może oznaczać ciche obniżenie jakości strony, dodatkowe sprawdzenia albo blokadę.
Krok 1: sprawdź, co twoja przeglądarka udostępnia
Zanim cokolwiek zmienisz, zobacz, co strona może odczytać z twojej automatyzacji. Poniższy skrypt otwiera stronę, którą kontrolujesz, i wypisuje istotne sygnały. To narzędzie diagnostyczne: używaj go na własnych stronach testowych, a nie do sprawdzania cudzych systemów.
from playwright.sync_api import sync_playwright
CHECK = """() => ({
webdriver: navigator.webdriver,
languages: navigator.languages,
plugins: navigator.plugins.length,
userAgent: navigator.userAgent,
screen: [screen.width, screen.height],
viewport: [window.innerWidth, window.innerHeight],
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
})"""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com") # zastąp stroną, którą posiadasz
print(page.evaluate(CHECK))
browser.close()
Uruchom ten sam skrypt z headless=False i porównaj oba wyniki. Różnice to rzeczy, które strona mogłaby zauważyć.
Krok 2: napraw niespójności, a nie tylko flagi
Ukrycie jednej flagi przy niezmienionych pozostałych to najczęstszy błąd. User agent, który podaje Windows, przy czcionkach, strefie czasowej i rozmiarze ekranu opisującym serwer Linux, jest mocniejszym sygnałem niż pojedyncza właściwość. Dąż do środowiska spójnego wewnętrznie:
- Używaj przeglądarki z oknem tam, gdzie to możliwe, albo trybu headless, który odpowiada aktualnej przeglądarce desktopowej.
- Ustaw viewport i język tak, żeby do siebie pasowały.
- Utrzymuj strefę czasową i locale zgodne z adresem IP, którego używasz.
- Używaj jednego profilu i jego ciasteczek dla jednej tożsamości, zamiast zaczynać od zera przy każdym uruchomieniu.
Playwright pozwala ustawić kilka z tych rzeczy w jednym miejscu:
context = browser.new_context(
locale="en-US",
timezone_id="America/New_York",
viewport={"width": 1366, "height": 768},
)
page = context.new_page()
Krok 3: zwolnij i zachowuj się jak odwiedzający
Automatyzacja staje się oczywista, gdy jest szybsza, niż mógłby być człowiek. Dodawaj realistyczne pauzy między ładowaniami stron, unikaj klikania tego samego elementu w idealnym rytmie i nie otwieraj setek stron równolegle z jednego adresu. Mniej i wolniejszych żądań zmniejsza też obciążenie serwisu, co i tak jest właściwe.
Krok 4: wiedz, kiedy sprawdzenie jest captcha
Niektóre przepływy wykrywania kończą się wyzwaniem zamiast blokady. Zobaczysz wtedy widget captcha, a ten krok wymaga tokena od solvera. Obsługiwany dziś w Scarnox typ captcha to PopularCaptcha. Przewodnik PopularCaptcha w Pythonie pokazuje, jak token jest pobierany i wysyłany. Inne widgety, takie jak Cloudflare Turnstile, są w planach, ale jeszcze nieobsługiwane, więc przed planowaniem sprawdź typy captcha wyjaśnione.
Sam krok captcha nie oznacza, że reszta konfiguracji jest poprawna. Jeśli ta sama strona blokuje każdą sesję headless bez względu na konfigurację, to wyraźny sygnał, że właściciel nie chce zautomatyzowanego dostępu. Uszanuj to.
Czego nie robić
Nie próbuj ukrywać automatyzacji przed stroną, która ją zabrania, i nie używaj narzędzi do omijania wykrywania, żeby przejść przez kontrolę dostępu. To inny rodzaj projektu niż testy i zbieranie danych publicznych, którymi zajmuje się ten przewodnik. Jeśli twój projekt wymaga dostępu, którego nie masz, zapytaj właściciela strony albo poszukaj oficjalnego API lub kanału danych.
Scrapuj odpowiedzialnie
- Sprawdź
robots.txti regulamin strony, zanim ją zautomatyzujesz. - Utrzymuj niskie tempo żądań i cache'uj strony, które już pobrałeś.
- Traktuj blokadę jako odpowiedź, a nie zagadkę do obejścia.
- Nie zbieraj danych osobowych bez podstawy prawnej.
Co dalej
Jeśli twoja automatyzacja służy testom end-to-end, podejście jest inne: zobacz captcha w testach automatycznych. Jeśli używasz konfiguracji Playwright lub Puppeteer, obsługa captcha w Playwright i Puppeteer wyjaśnia, gdzie trafia token.
Zacznij z darmowym kredytem próbnym, bez karty: załóż konto i przetestuj przepływ PopularCaptcha na własnej stronie. Aktualne stawki znajdziesz na stronie cennika.