Jak unikać CAPTCHA podczas scrapingu (Zmień sygnały, nie rozwiązuj)

Rozwiązywanie CAPTCHA jest powolne, kosztowne i leczy objaw. Trwałe rozwiązanie to nigdy nie wywoływać CAPTCHA: obniż swój wynik ryzyka, oczyszczając sygnały, które go wywołują.

Instynkt, gdy scraper trafia na CAPTCHA, to sięgnąć po usługę rozwiązującą. To zły instynkt. CAPTCHA to nie ściana, którą trzeba przebić - to widoczny wynik oceny ryzyka, która już zdecydowała, że wyglądasz na zautomatyzowanego. Rozwiązywanie jest powolne, kosztuje za każde rozwiązanie i nie obniża tego wyniku, więc następne żądanie znowu zostanie zakwestionowane. Trwała odpowiedź na jak unikać CAPTCHA podczas scrapingu to przestać je wywoływać: oczyść garść sygnałów, które pchają twój wynik w czerwień.

Dlaczego rozwiązywanie to przegrany ruch

Rozważ, jak naprawdę działa reCAPTCHA v2. Strona osadza publiczny klucz witryny; rozwiązanie wyzwania zapisuje długi token w ukrytym polu g-recaptcha-response, które serwer później weryfikuje. Ten token jest jednorazowy z założenia - środek ochrony przed powtórnym użyciem - więc nie możesz go rozwiązać raz i ponownie użyć. Usługi rozwiązywania (farmy ludzkie lub rozwiązania ML) zwracają nowy token na każde wyzwanie, co oznacza, że płacisz i czekasz sekundy za każdym razem, gdy wynik pozostaje wysoki. Zautomatyzowałeś objaw, nie usunąłeś przyczyny.

Istnieje również subtelniejsza pułapka: wyzwanie jest wyświetlane właśnie dlatego, że właściciel strony nie chce zautomatyzowanego ruchu na tej trasie. Jeśli istnieje udokumentowane API, użyj go. Jeśli nie, pragmatycznym celem jest wyglądać wystarczająco jak zwykły odwiedzający, aby silnik ryzyka nigdy nie eskalował. To wszystko zależy od sygnałów, które wysyłasz.

Diagram pasma wyniku ryzyka pokazujący, jak reputacja IP, odcisk TLS, nagłówki, tempo żądań i ciasteczka pchają scraper w kierunku CAPTCHA
Wyzwanie jest wynikiem. To, co faktycznie możesz kontrolować, to wynik ryzyka, który je produkuje.

Sygnał 1: jakość IP jest największą dźwignią

Najsilniejszym pojedynczym wejściem jest miejsce, z którego pochodzi żądanie. Zakresy IP centrum danych są katalogowane i wstępnie oceniane; nowe żądanie z jednego z nich może zacząć się w połowie skali ryzyka, zanim wyślesz bajt ładunku. IP rezydencjalne - prawdziwe połączenia domowe - zaczynają znacznie niżej. Dlatego klasyczna rada w terenie brzmi: korzystaj z IP rezydencjalnych, a gdy pojawi się wyzwanie, rotuj do nowego wyjścia zamiast uderzać w spalone. Pula proxy rezydencjalnych z rotacją per żądanie wśród ponad 90M IP sprawia, że to automatyczne - nigdy nie skrapujesz całej pracy z jednego adresu.

Zanim zaufasz jakiejkolwiek puli, zmierz ją. Nasz darmowy sprawdzacz jakości IP pokazuje wynik oszustwa/reputacji, który silnik antybotowy przypisałby wyjściu - IP centrum danych z wysokim wynikiem oszustwa to CAPTCHA, która czeka na zdarzenie. Jeśli chcesz pełnego obrazu, dlaczego reputacja przewyższa odcisk na większości stron, nasz post na temat dlaczego wynik oszustwa ma znaczenie idzie głębiej.

import requests

# Detect a challenge in the response and rotate the exit instead of retrying
CHALLENGE_MARKERS = ("g-recaptcha", "hcaptcha", "/cdn-cgi/challenge", "captcha-delivery")

def looks_challenged(resp):
    if resp.status_code in (403, 429, 503):
        return True
    body = resp.text[:20000].lower()
    return any(m in body for m in CHALLENGE_MARKERS)

def fetch(url):
    # rotating gateway hands out a new residential IP each request
    proxy = "http://USER:PASS@rotating.quantumproxies.io:8000"
    r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=20)
    if looks_challenged(r):
        return None  # burn this exit, the gateway rotates on the next call
    return r

Sygnał 2: twój odcisk TLS cię zdradza

Nawet na czystym IP, uścisk TLS cię zdradza. Surowe żądanie z domyślnego stosu Pythona lub Go generuje odcisk JA3/JA4, który nie wygląda jak Chrome - prawdziwa przeglądarka reklamuje określoną kolejność szyfrów, rozszerzenia i wartości ALPN, których biblioteki skryptowe nie replikują. Silniki antybotowe haszują ten uścisk i porównują go z podpisami znanych botów. Rozwiązaniem jest wysłanie prawdziwego odcisku przeglądarki, albo za pomocą klienta imitującego TLS, albo uruchamiając rzeczywisty silnik przeglądarki. Opisujemy mechanikę w jak działa odcisk JA3/JA4.

Sygnał 3: spójność nagłówków

Nagłówki muszą być zgodne ze sobą i z odciskiem. Żądanie, które twierdzi, że jest Chrome 120 na Windows, ale pomija pasujące wskazówki klienta sec-ch-ua, wysyła nagłówki w złej kolejności lub łączy mobilny User-Agent z desktopowym profilem TLS, jest trywialnie niespójne. Nie ustawiaj tylko User-Agent - wyślij pełny, spójny zestaw, jaki wysłałaby prawdziwa przeglądarka, i utrzymuj go zgodnie z platformą, którą naśladujesz.

# Coherent header set that matches a Chrome-on-Windows fingerprint
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "sec-ch-ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    "sec-ch-ua-platform": '"Windows"',
    "Upgrade-Insecure-Requests": "1",
}
Lista kontrolna w dwóch kolumnach mapująca sygnały wywołujące CAPTCHA na ich złagodzenia
Pracuj od lewej kolumny do prawej, a wyzwanie przestanie się pojawiać.

Sygnał 4: zachowanie i tempo

Częstotliwość żądań na IP jest głównym sygnałem tempa. Sześćdziesiąt żądań na minutę z jednego adresu wygląda jak bot; te same sześćdziesiąt rozłożone na sześćdziesiąt IP wygląda jak sześćdziesiąt osób. Zwolnij, dodaj losowe opóźnienia między żądaniami i rozłóż wolumen na pulę. Na celach z dużą ilością JavaScript, ocena zachowania również obserwuje ruch myszy, przewijanie i czas przebywania - jeśli prowadzisz przeglądarkę bezgłową, nie klikaj natychmiast. Rotacja zmniejsza blokowanie oparte na IP; nie usprawiedliwia wzorca żądań jak z karabinu maszynowego. Pełna dyscyplina jest w naszej liście kontrolnej antybanowej.

Sygnał 5: ciągłość sesji i ciasteczek

Istnieje piąty, cichszy sygnał: ciągłość. Żądanie, które przychodzi bez ciasteczek, bez odsyłacza i bez historii, wygląda jakby pojawiło się znikąd - co jest dokładnie tym, co robi naiwny bot. Prawdziwi użytkownicy gromadzą sesję: lądują na stronie, ustawiają ciasteczka i przenoszą je dalej przez kliknięcia. Zachowaj ciasteczka w ramach sesji, wchodź przez wiarygodne strony zamiast głęboko linkować zimno do chronionej trasy i utrzymuj jedną tożsamość przez cały spójny przepływ. Rotacja IP w trakcie logowania robi odwrotnie - niszczy ciągłość i podnosi wynik - co jest dokładnie powodem, dla którego istnieją sesje przyklejone do stanowych kroków jak koszyki i logowania.

Gdy wyzwanie jest nieuniknione

Niektóre trasy blokują każdego odwiedzającego - ściana logowania, kasa, agresywnie chronione wyszukiwanie. Tam żadna ilość higieny sygnałów nie usuwa wyzwania, a utrzymanie odcisków przeglądarki, imitacji TLS i czystej puli ręcznie staje się własnym projektem. To jest moment, aby przekazać cały stos do Scraper API, który posiada prawdziwy odcisk przeglądarki, rotuje IP rezydencjalne i renderuje JavaScript na żądanie - wysyłasz URL i otrzymujesz HTML lub JSON z powrotem, obsługa wyzwań wliczona. To mniej ruchomych części niż własna farma rozwiązywaczy i wyższy wskaźnik sukcesu.

Zacznij od czystych IP rezydencjalnych

Najczęściej zadawane pytania

Jak unikać CAPTCHA podczas web scrapingu?

Obniż wynik ryzyka, który je wywołuje. Skrapuj z IP rezydencjalnych zamiast oznaczonych zakresów centrum danych, wysyłaj prawdziwy odcisk przeglądarki TLS ze spójnymi nagłówkami, dostosuj tempo żądań i rozłóż je na wiele IP, oraz przenoś ciasteczka w ramach sesji. Gdy pojawi się wyzwanie, rotuj wyjście zamiast ponawiać to samo spalone IP.

Czy lepiej rozwiązywać czy unikać CAPTCHA?

Unikaj ich. Rozwiązywanie jest per-wyzwanie, kosztuje pieniądze i czas, a token reCAPTCHA jest jednorazowy, więc uporczywie wysoki wynik ryzyka oznacza, że płacisz ponownie przy każdym żądaniu. Zapobieganie naprawia przyczynę raz. Zarezerwuj rozwiązywanie dla rzadkiej trasy, która wyzwala każdego odwiedzającego niezależnie od tego, jak czyste są twoje sygnały.

Czy proxy rezydencjalne zatrzymują CAPTCHA?

Usuwają największy pojedynczy wyzwalacz - złą reputację IP - ale same w sobie nie są kompletnym rozwiązaniem. IP rezydencjalne sparowane z domyślnym odciskiem TLS Pythona i wzorcem żądań jak z karabinu maszynowego nadal będą wyzwalane. Połącz czyste IP z odciskiem przeglądarki, spójnymi nagłówkami i rozsądnym tempem.

Dlaczego dostaję CAPTCHA nawet na IP rezydencjalnym?

Ponieważ IP to tylko jedno wejście. Twój odcisk TLS/JA3, spójność nagłówków, tempo żądań i brak ciasteczek sesji nadal wpływają na wynik. Raz oznaczone wyjście rezydencjalne może również nosić niedawną historię. Sprawdź wyjście za pomocą darmowego narzędzia do oceny jakości IP, wyślij prawdziwy odcisk przeglądarki i zwolnij tempo żądań, zanim założysz, że problemem jest IP.

Przestań traktować CAPTCHA jako przeszkodę. To odczyt wszystkiego, co wysłałeś, zanim się pojawiła. Oczyść IP, odcisk, nagłówki i tempo, a odczyt pozostanie zielony - bez potrzeby rozwiązywacza.

Sprawdź darmowo wynik oszustwa swojego wyjścia IP