# 403, 429 i CAPTCHA: reaguj, nie omijaj

> Jak radzić sobie z 403, 429 i CAPTCHA podczas scrapingu: co oznacza każdy sygnał, uprzejmy crawler Python z robots.txt i Retry-After, czego unikać.

- URL: https://crawlrelay.com/pl/guides/403-429-captcha/
- Ostatnia aktualizacja: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

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.

**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

| Atrybut | Wartość |
| --- | --- |
| 429 Zbyt wiele żądań | Jesteś zbyt szybki. Szanuj Retry-After, cofnij się, zmniejsz współbieżność na hosta |
| 403 Forbidden | To żądanie zostało odrzucone. Jeden ponowny ruch po przerwie, potem zatrzymaj i sprawdź zasady strony |
| CAPTCHA lub strona wyzwania | Strona chce sprawdzić, czy jesteś człowiekiem. Zatrzymaj host i zwolnij tempo |
| Standard dla zasad crawlowania | robots.txt, RFC 9309; Crawl-delay to popularne rozszerzenie |
| Czego nie wspieramy | Rozwią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 kontynuuje | Zatrzymaj, gdy |
| --- | --- | --- | --- |
| 429 | Poczekaj na Retry-After lub wycofaj się wykładniczo z jitterem | Zmniejsz współbieżność na tym hoście o połowę | Retry-After rośnie albo 429 utrzymuje się przy pojedynczym żądaniu |
| 403 | Jeden ponowny ruch po przerwie, ten sam kraj | Porównaj z przeglądarką z tego samego kraju; sprawdź robots.txt i regulamin | Drugi 403 na tym samym wzorcu URL |
| CAPTCHA / wyzwanie | Zatrzymaj host na kilka minut | Wznów z dużo niższym tempem | Wyzwanie powraca nawet przy niskim tempie: strona nie chce automatycznego dostępu |
| 503 z Retry-After | Poczekaj zgodnie z prośbą | Zatrzymaj host | Wię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*

```python
import time
import urllib.robotparser
from urllib.parse import urlsplit

import requests

PROXY = "http://USERNAME-country-us:PASSWORD@gw.crawlrelay.com: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](https://crawlrelay.com/pl/acceptable-use/) 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

1. [RFC 9309: Protokół wykluczania robotów](https://www.rfc-editor.org/rfc/rfc9309.html) — IETF (2022-09)
2. [RFC 6585: Dodatkowe kody statusu HTTP (429)](https://www.rfc-editor.org/rfc/rfc6585) — IETF (2012-04)
3. [Reddit przeciwko SerpApi LLC](https://www.loeb.com/en/insights/publications/2026/08/reddit-v-serpapi-llc) — Loeb & Loeb (2026-08)
4. [Google przeciwko SerpApi: sąd oddalił nasz wniosek o odrzucenie](https://serpapi.com/blog/google-v-serpapi-the-court-granted-our-motion-to-dismiss/) — SerpApi (2026-07-21)

**Proxy rezydencjalne dla uprzejmych crawlerów** 1,50 USD za 1 GB, 0,50 USD/GB od 50 GB. [Zobacz ceny](https://crawlrelay.com/pl/pricing/) · [Podręcznik błędów](https://crawlrelay.com/pl/docs/errors/)

---

CrawlRelay: CrawlRelay to serwis proxy rezydencjalne i mobilne proxy 4G/5G z rotacją, stworzony dla programistów i potoków danych AI: ruch bez wygasania w modelu pay-as-you-go od 0,50 USD/GB, płatny w kryptowalutach, bez konieczności przesyłania dokumentów. Bez KYC — brak dowodu, selfie i dokumentów. Płać w kryptowalutach.
