Uprzejme skrobanie, które nadal się skalowalnie: Przewodnik po ograniczaniu szybkości

Uderzanie w witrynę powoduje zablokowanie; przeszukiwanie jednego żądania na raz prowadzi donikąd. Skalowalnym środkiem jest adaptacyjne dostosowywanie tempa na domenę, rozłożone na czyste IP — uprzejme dla witryny, szybkie dla Ciebie.

Prawie połowa całego ruchu internetowego jest teraz zautomatyzowana, a strony internetowe o tym wiedzą. Ograniczanie szybkości to ich pierwsza i najprostsza obrona — limit prędkości, który decyduje, ile możesz wziąć i jak szybko. Kuszące jest traktowanie tego jako przeszkody do przebicia się siłą, ale to prowadzi do zablokowania. Przeciwny błąd, przeszukiwanie jednego ostrożnego żądania na raz, prowadzi donikąd na dużą skalę. Skalowalną odpowiedzią jest uprzejme skrobanie: dostosuj tempo każdego celu tak, jak zrobiłby to ciężki, ale legalny użytkownik, rozłóż obciążenie na czyste IP i pozwól, aby odpowiedzi witryny dostosowały Twoją prędkość. To jest sposób, w jaki pozostajesz szybki, nie stając się ruchem, który powoduje zablokowanie wszystkich.

Wiedzieć, jaki limit przekraczasz

Serwery liczą Twoje żądania względem identyfikatora — zwykle Twojego IP, czasami klucza API lub konta — w ramach okna czasowego i reagują, gdy przekroczysz próg. Trzy popularne modele zachowują się inaczej: stałe okno liczy żądania na minutę kalendarzową; token bucket przydziela Ci stałą liczbę tokenów (powiedzmy 100 na minutę) i zużywa jeden na żądanie, zmuszając do czekania, gdy kubełek się opróżni; przesuwne okno liczy w ciągu ostatnich 60 sekund w dowolnym momencie. Praktycznym skutkiem jest to, że nagły wzrost jest bardziej niebezpieczny niż stały strumień — dziesięć żądań w jednej sekundzie może przekroczyć limit, którego sto rozłożone na minutę by nie przekroczyło.

Limity również występują w różnych odmianach. Miękkie limity są łagodne: serwer spowalnia Cię lub zwraca 429 Too Many Requests z nagłówkiem Retry-After, mówiąc dokładnie, jak długo czekać (błąd 1015 Cloudflare to właśnie to). Niektóre witryny tolerują małe skoki — pozwalając na 100 na minutę, ale ograniczając dopiero przy 120 — podczas gdy inne ograniczają wcześnie, powiedzmy przy 15 na minutę, i blokują twardo dopiero przy 30. Twarde limity to ścisłe sufity: API, które pozwala na 1,000 żądań na godzinę, całkowicie Cię blokuje, gdy je przekroczysz. Naciskaj na miękki limit wielokrotnie, a on eskaluje: 429 zamienia się w 403, potem w tymczasowy zakaz trwający od minut do godzin, którego okno rośnie za każdym razem, gdy go przekraczasz, a w końcu w trwałą czarną listę Twojego IP lub całej podsieci.

Czytaj odpowiedź, nie zgaduj

Największym ulepszeniem dla skrobaka jest reagowanie na to, co mówi Ci serwer, zamiast wysyłania stałej liczby żądań. Naucz się słownictwa: 429 oznacza zwolnienie i honorowanie Retry-After; 403 oznacza, że ta tożsamość jest oznaczona, więc rotuj zamiast ponawiać; 503 to często wyzwanie lub tymczasowe odrzucenie; a 200, które zwraca stronę CAPTCHA, to miękka blokada, a nie sukces. Traktuj każde inaczej. Zła decyzja — ponawianie tego samego spalonego IP przy 403 lub ignorowanie Retry-After i forsowanie przy 429 — to to, co zamienia miękkie ostrzeżenie w trwały zakaz. Nasze dogłębne analizy dotyczące naprawiania 429 szczegółowo omawiają obsługę odpowiedzi.

import time, requests

def polite_get(session, url, max_tries=4):
    for attempt in range(max_tries):
        r = session.get(url, timeout=20)
        if r.status_code == 200 and "captcha" not in r.text.lower():
            return r
        if r.status_code == 429:                       # obey the server
            wait = int(r.headers.get("Retry-After", 2 ** attempt))
            time.sleep(wait)
            continue
        if r.status_code in (403, 503):                # this exit is burned
            rotate_ip(session)                         # fresh IP, then retry
            time.sleep(2 ** attempt)                    # exponential backoff
            continue
        return r
    return None
Diagram pętli adaptacyjnego tempa, która wysyła żądanie, odczytuje kod statusu, rotuje IP i cofa się, a następnie dostosowuje tempo
Pozwól, aby kody odpowiedzi witryny kierowały Twoją prędkością: przyspieszaj przy 200, przestrzegaj Retry-After przy 429, rotuj przy 403.

Budżetuj żądania na domenę

Skrobak, który dotyka wielu witryn, nigdy nie powinien stosować jednego globalnego tempa do wszystkich. Mały blog i utwardzony rynek tolerują zupełnie różne obciążenia, więc daj każdej domenie własny budżet. Token bucket na hosta to czysty wzorzec: przypisz konserwatywne tempo na domenę, uzupełniaj je z czasem i pozwól, aby żądania do różnych hostów działały równolegle, podczas gdy żądania do tego samego hosta pozostają w jego limicie. Zacznij powoli na nowym celu i pozwól, aby kody odpowiedzi powiedziały Ci, czy możesz przyspieszyć.

import time
from collections import defaultdict

class DomainLimiter:
    def __init__(self, per_min=30):
        self.gap = 60.0 / per_min          # min seconds between hits per host
        self.last = defaultdict(float)
    def wait(self, host):
        now = time.time()
        delay = self.gap - (now - self.last[host])
        if delay > 0:
            time.sleep(delay)
        self.last[host] = time.time()

# 30 req/min to any single host; different hosts proceed independently
limiter = DomainLimiter(per_min=30)
limiter.wait("example.com")

Rozłóż obciążenie, aby każde IP pozostało uprzejme

Oto ruch, który godzi "uprzejmość" z "skalowalnością": uprzejmość mierzona jest na IP, ale całkowita przepustowość to suma na IP. Jeśli cel toleruje 30 żądań na minutę na adres, jedno IP ogranicza Cię do 30 — ale dziesięć czystych IP, każde wykonujące 30, daje Ci 300 na minutę, podczas gdy każde indywidualne wyjście pozostaje uprzejme. Rotacyjna brama rezydencjalna robi to automatycznie, przydzielając świeże IP na żądanie z ponad 90 milionów adresów, więc żadne pojedyncze wyjście nie wygląda agresywnie. To nie jest sztuczka, aby mocniej uderzać; to rozkładanie prawdziwego obciążenia, aby żaden serwer nie ponosił podejrzanego skoku. Podstawy rotacji IP są w czym jest rotacja IP i dlaczego ma znaczenie.

Rozłóż obciążenie na czyste, rotacyjne IP

Bierz mniej, buforuj więcej, wybieraj godziny

Najbardziej uprzejme żądanie to to, którego nigdy nie wysyłasz. Trzy nawyki zmniejszają obciążenie bez utraty danych. Po pierwsze, buforuj agresywnie i używaj żądań warunkowych — wyślij If-Modified-Since lub If-None-Match, aby niezmieniona strona zwróciła małe 304 zamiast pełnego ciała, co oszczędza serwer i Twoją przepustowość. Po drugie, budżetuj współbieżność celowo: semafor ograniczający żądania w trakcie dla każdej domeny zapobiega przypadkowemu wybuchowi. Po trzecie, planuj ciężkie zadania na godziny poza szczytem celu, kiedy Twój ruch stanowi mniejszy udział ich ruchu i jest mniej prawdopodobne, że przekroczy próg. Połączenie tych działań może zmniejszyć liczbę żądań potrzebnych do wykonania zadania o połowę — dyscyplina stojąca za naszym szerszym checklistą antybanową.

Jeszcze jedna rzecz warta wyraźnego powiedzenia: sprawdź robots.txt i honoruj oczekiwania dotyczące przeszukiwania witryny. Uprzejmość to nie tylko samoobrona — bycie dobrym obywatelem utrzymuje otwarty internet dostępny do przeszukiwania dla wszystkich. Nasz przewodnik po robots.txt w praktyce omawia, co wiąże, a co nie.

Diagram drabiny eskalacyjnej od miękkiego limitu 429 do 403, tymczasowego zakazu i trwałej czarnej listy IP lub podsieci
Naciskaj na miękki limit wielokrotnie, a on się utwardza: 429 zamienia się w 403, potem w rosnący tymczasowy zakaz, a następnie w trwałą czarną listę.

Często zadawane pytania

Jak uniknąć ograniczania szybkości podczas scrapingu?

Dostosuj tempo dla każdej domeny z własnym budżetem żądań, honoruj Retry-After przy 429, cofaj się wykładniczo i rozkładaj obciążenie na rotacyjny zbiór czystych IP, aby żaden pojedynczy adres nie wyglądał agresywnie. Dodaj buforowanie i żądania warunkowe, aby wysyłać mniej żądań ogółem, i planuj ciężkie zadania na godziny poza szczytem celu.

Co oznacza HTTP 429 i jak sobie z nim radzić?

429 Too Many Requests to miękki limit szybkości — serwer prosi Cię o zwolnienie, a nie blokuje. Przeczytaj nagłówek Retry-After i czekaj dokładnie tak długo przed ponowną próbą; jeśli go brakuje, cofaj się wykładniczo. Nigdy go nie ignoruj i nie forsuj dalej, ponieważ powtarzające się 429 eskalują do 403, a następnie do czasowych lub trwałych zakazów.

Ile żądań na minutę jest bezpieczne?

Nie ma uniwersalnej liczby — to zależy całkowicie od celu. Mała witryna może tolerować tylko kilka żądań na minutę; duża, znacznie więcej. Zacznij konserwatywnie (powiedzmy 20–30 na minutę na IP), obserwuj 429 i dostosuj się do odpowiedzi. Skaluj całkowitą przepustowość, dodając IP, a nie podnosząc tempo na jednym.

Czy rotacyjne proxy są nieuprzejme?

Nie, gdy są używane do rozkładania prawdziwego obciążenia. Rotacja utrzymuje każde indywidualne IP w uprzejmym tempie, podczas gdy Twoja łączna przepustowość rośnie — serwer nigdy nie widzi podejrzanego skoku z żadnego jednego adresu. Staje się nieuprzejme tylko wtedy, gdy używasz go do przekraczania tego, co witryna może rozsądnie obsłużyć w całości; dostosuj tempo łączne, a nie tylko na IP.

Uprzejmość i skalowalność nie są przeciwieństwami. Czytaj sygnały, honoruj Retry-After, budżetuj na domenę, buforuj, co możesz, i rozkładaj resztę na czyste, rotacyjne IP. Kończysz szybciej niż lekkomyślny skrobak — ponieważ to Ty nigdy nie zostajesz zablokowany.

Skaluj uprzejmie z rotacyjnymi proxy rezydencjalnymi