Bez KYC — brak dowodu, selfie i dokumentów. Płać w kryptowalutach: BTC, USDT, USDC, ETH, SOL, LTC
Język: Polski
Rozpocznij

Przewodnik · odpowiedzialne crawlowanie · 2026

403, 429 i CAPTCHA: reaguj, nie omijaj

403, 429 lub CAPTCHA to sygnały od strony do twojego crawlena. Właściwą odpowiedzią jest niemal zawsze zwolnienie tempa, przeczytanie zasad lub zapytanie; błędem jest ukrywanie crawlena. Oto jak wbudować właściwą odpowiedź w kod.

Ostatnia aktualizacja: · 6 min czytania

Szybka odpowiedź

Jak scraper powinien obsługiwać odpowiedzi 403, 429 i CAPTCHA?

Traktuj je jako sygnały, nie przeszkody. Przy 429 poczekaj Retry-After i zmniejsz tempo na tym hoście. Przy 403 spróbuj ponownie raz po przerwie, potem zatrzymaj się i sprawdź zasady strony. Przy CAPTCHA zatrzymaj ten host: nie rozwiązuj automatycznie. CrawlRelay proxy rezydencjalne, od 0,50 USD/GB, rozkładają obciążenie i ustawiają lokalizację; nie są sposobem na obejście decyzji strony. Bez KYC. Płać w kryptowalutach.

Trzy sygnały w pigułce

429 Zbyt wiele żądańJesteś zbyt szybki. Szanuj Retry-After, cofnij się, zmniejsz współbieżność na hosta
403 ForbiddenTo żądanie zostało odrzucone. Jeden ponowny ruch po przerwie, potem zatrzymaj i sprawdź zasady strony
CAPTCHA lub strona wyzwaniaStrona chce sprawdzić, czy jesteś człowiekiem. Zatrzymaj host i zwolnij tempo
Standard dla zasad crawlowaniarobots.txt, RFC 9309; Crawl-delay to popularne rozszerzenie
Czego nie wspieramyRozwiązywania CAPTCHA, ukrytych wtyczek, podszywania się pod fingerprinty

Co każdy sygnał mówi mojemu crawlerowi?

  • 429 to najsłodszy sygnał: treść jest dostępna, ale nie w twoim tempie. RFC 6585 go definiuje, często z nagłówkiem Retry-After mówiącym kiedy wrócić.
  • 403 to odmowa tego żądania. Może dać się naprawić (zły kraj, brakujące nagłówki, zbyt szybkie żądania) lub być ostateczna (strona nie zezwala na automatyczny dostęp do tej zawartości).
  • CAPTCHA lub strona wyzwania, często podawane z kodem 403 lub 503, oznaczają, że zarządzanie botami na stronie kwestionuje twój ruch. To eskalacja: etap po ignorowanych 429.

Wszystkie trzy to rosnące sygnały. Strony, które widzą ignorowanie 429, eskalują do 403 i wyzwań, potem do długich blokad całych zakresów IP, co szkodzi wszystkim użytkownikom tych zakresów.

Co powinien zrobić mój crawler dla każdego sygnału?

SygnałPierwsza odpowiedźJeśli kontynuujeZatrzymaj, gdy
429Poczekaj na Retry-After lub wycofaj się wykładniczo z jitteremZmniejsz współbieżność na tym hoście o połowęRetry-After rośnie albo 429 utrzymuje się przy pojedynczym żądaniu
403Jeden ponowny ruch po przerwie, ten sam krajPorównaj z przeglądarką z tego samego kraju; sprawdź robots.txt i regulaminDrugi 403 na tym samym wzorcu URL
CAPTCHA / wyzwanieZatrzymaj host na kilka minutWznów z dużo niższym tempemWyzwanie powraca nawet przy niskim tempie: strona nie chce automatycznego dostępu
503 z Retry-AfterPoczekaj zgodnie z prośbąZatrzymaj hostWiększość prób zawodzi dłużej niż kilka minut

Jak zbudować crawlena, który reaguje poprawnie?

Wprowadź zasady do fetchera, nie do każdego spidera. Ten wysyła jedno żądanie na raz na hosta, honoruje robots.txt i jego Crawl-delay, czeka na Retry-After i przestaje pytać host po trzech odmowach z rzędu. Traktuje 4xx robots.txt jako pozwolenie, a 5xx jako całkowity zakaz, zgodnie z RFC 9309.

Python: uprzejmy fetcher
import time
import urllib.robotparser
from urllib.parse import urlsplit

import requests

PROXY = "http://USERNAME-country-us:[email protected]:7777"
USER_AGENT = "ExampleCrawler/1.0 (+https://example.com/crawler-info)"


class PoliteFetcher:
    """One request at a time per host; robots.txt, Crawl-delay and Retry-After honoured."""

    def __init__(self, min_interval=1.0, max_refusals=3):
        self.min_interval, self.max_refusals = min_interval, max_refusals
        self.http = requests.Session()
        self.http.proxies = {"http": PROXY, "https": PROXY}
        self.http.headers["User-Agent"] = USER_AGENT
        self.robots, self.next_time, self.refusals = {}, {}, {}

    def _robots(self, root):
        if root not in self.robots:
            rp = urllib.robotparser.RobotFileParser(root + "/robots.txt")
            try:
                r = self.http.get(root + "/robots.txt", timeout=(10, 30))
                if r.status_code >= 500:
                    rp.parse(["User-agent: *", "Disallow: /"])  # unreachable: assume disallow
                else:
                    rp.parse(r.text.splitlines() if r.status_code == 200 else [])  # 4xx: allowed
            except requests.RequestException:
                rp.parse(["User-agent: *", "Disallow: /"])
            self.robots[root] = rp
        return self.robots[root]

    def get(self, url):
        scheme, host = urlsplit(url)[:2]
        if self.refusals.get(host, 0) >= self.max_refusals:
            return None  # this host said no: stop asking
        rp = self._robots("%s://%s" % (scheme, host))
        if not rp.can_fetch(USER_AGENT, url):
            return None
        delay = max(self.min_interval, rp.crawl_delay(USER_AGENT) or 0)
        wait = self.next_time.get(host, 0) - time.monotonic()
        if wait > 0:
            time.sleep(wait)
        r = self.http.get(url, timeout=(10, 30))
        pause = delay
        if r.status_code in (429, 503):
            retry_after = r.headers.get("Retry-After", "")
            pause = max(delay, int(retry_after) if retry_after.isdigit() else 60)
        refused = r.status_code in (403, 429) or "captcha" in r.text[:5000].lower()
        self.refusals[host] = self.refusals.get(host, 0) + 1 if refused else 0
        self.next_time[host] = time.monotonic() + pause
        return r


fetcher = PoliteFetcher()
resp = fetcher.get("https://example.com/")
print(resp.status_code if resp is not None else "skipped")

Co naprawdę naprawia 403?

Kilka przyczyn 403 leży po twojej stronie, więc naprawienie ich jest zgodne z zasadami:

  • Zły kraj. Wiele stron obsługuje tylko jeden region. Celuj w kraj dzięki -country-<code>.
  • Niepełne nagłówki. Wyślij Accept, Accept-Language i uczciwego user agenta z URL kontaktowym. User agent imitujący przeglądarkę na zwykłym kliencie HTTP to niespójność i często odrzucany.
  • Twoje tempo. 403 pojawiający się po N żądaniach to problem z tempem; zwolnij.

Co nie jest naprawą: rotowanie user agentów, by wyglądać jak wiele osób, podszywanie się pod fingerprinty przeglądarki czy zmienianie IP, aby obejść blokadę nałożoną celowo przez stronę. Jeśli strona filtruje zakresy hostingowe, by blokować ruch automatyczny, proxy rezydencjalne nie uprawnia do dostępu.

Dlaczego po prostu nie rozwiązać CAPTCHA?

Ponieważ CAPTCHA to pytanie zadane przez stronę, na które odpowiedziałbyś fałszywie. Automatyczne rozwiązywanie zmienia uprzejmego crawlera w narzędzie mające na celu obejście kontroli dostępu, co zwiększa Twoje ryzyko prawne: sprawy w USA z 2026 roku dotyczące scrapowania wyników wyszukiwania, Google przeciwko SerpApi oraz Reddit przeciwko SerpApi i inne, opierają się na zarzutach, że oskarżeni obejśli system antybotowy zgodnie z przepisami DMCA dotyczącymi obstrukcji. Sąd nie rozstrzygnął tej kwestii, ale ryzyko jest realne.

CrawlRelay nie wspiera rozwiązywania CAPTCHA ani unikania wykrywania botów, a jego Polityka Użycia zabrania takich działań przez gateway. Jeśli potrzebujesz danych zamkniętych za takim wyzwaniem, poproś stronę o dostęp, skorzystaj z jej API lub wykup licencję na dane.

Kiedy powinienem skontaktować się ze stroną?

Gdy potrzebujesz więcej niż pozwalają domyślne limity. Wiele stron oferuje API, kanał danych, program partnerski lub po prostu wyższy limit dla crawlera, który się identyfikuje i wyjaśnia swój cel. Zamieść URL kontaktowy w user agencie, utrzymuj stronę opisującą Twojego crawlera oraz sposób rezygnacji i szybko odpowiadaj na zgłoszenia nadużyć. Crawler, z którym można się skontaktować, otrzymuje ostrzeżenia przed blokadami.

403, 429 i CAPTCHA: pytania

Czy proxy rezydencjalne eliminują CAPTCHA?

Nie licz na to. Proxy rezydencjalne zmieniają IP wyjściowe widziane przez stronę, ale nie zmieniają zachowania Twojego crawlera: CAPTCHA wywołane Twoim tempem lub zachowaniem pozostają i tak powinno być. Jeśli wyzwania pojawiają się przy niskim współczynniku zapytań, strona nie chce automatycznego dostępu do tych treści.

Jak długo czekać po 429 bez nagłówka Retry-After?

Zacznij od kilku sekund i podwajaj czas oczekiwania po każdym kolejnym 429, dodając losową wartość i limit ok. jednej minuty. Gdy zapytania znowu się powiodą, zmniejsz szybkość do poziomu niższego niż ten, który wywołał 429 i powoli ją zwiększaj, jeśli liczba błędów utrzymuje się na stałym poziomie.

Czy rotacja IP w celu uniknięcia limitów jest dozwolona?

Rotacja rozkłada obciążenie na różne proxy rezydencjalne i pozwala wybrać lokalizacje, co jest normalne. Używanie rotacji, by pozostać poniżej limitu na jednego IP, a jednocześnie utrzymywać odrzuconą przez stronę szybkość, to obejście zasad. Większość regulaminów tego zabrania, tak samo jak nasza Polityka Użycia.

Jakiego user agenta powinien wysyłać mój scraper?

Własnego: nazwę, wersję i URL wyjaśniający crawler oraz dane kontaktowe, np. ExampleCrawler/1.0 (+https://example.com/crawler-info). Nie używaj nazw innych crawlerów, takich jak Googlebot czy GPTBot.

Źródła (4)
  1. RFC 9309: Protokół wykluczania robotów — IETF (2022-09)
  2. RFC 6585: Dodatkowe kody statusu HTTP (429) — IETF (2012-04)
  3. Reddit przeciwko SerpApi LLC — Loeb & Loeb (2026-08)
  4. Google przeciwko SerpApi: sąd oddalił nasz wniosek o odrzucenie — SerpApi (2026-07-21)

Proxy rezydencjalne dla uprzejmych crawlerów

1,50 USD za 1 GB, 0,50 USD/GB od 50 GB.

Od 0,50 USD/GB · bez KYC

Rozpocznij