Scarnox · Blog

Captcha w web scrapingu: dlaczego się pojawiają i co robić

Captcha pojawia się podczas scrapingu, gdy strona uzna, że żądanie wygląda na zautomatyzowane. Typowe wyzwalacze to zbyt wiele żądań w krótkim czasie, adres IP o słabej reputacji, brakujące sygnały przeglądarki albo trafienie w stronę, którą witryna chroni bardziej niż resztę. Praktyczna odpowiedź ma trzy kroki, w tej kolejności: ogranicz wyzwalacze, wykryj captcha w kodzie i rozwiąż captcha, której nie możesz uniknąć. Ten przewodnik omawia każdy krok i wskazuje szczegółowe przewodniki po reszcie.

Dlaczego strony pokazują captcha scraperom

Strona ma mało możliwości, by odróżnić człowieka od skryptu w chwili żądania strony, więc patrzy na wzorce. Scraper często wyróżnia się tym, że:

Wystarczy jeden z tych czynników. Captcha to sposób strony na poproszenie o krok zgodny z zachowaniem człowieka, zanim pokaże kolejne strony. Zmniejszenie wzorca zwykle zmniejsza liczbę captcha, co jest tańsze niż ich rozwiązywanie.

Wykryj captcha w kodzie

Zanim cokolwiek rozwiążesz, sprawdź, czy strona, którą otrzymałeś, w ogóle jest stroną captcha. Prosty test szuka znacznika widgetu i odczytuje sitekey:

import re
import requests

SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')

def fetch(url: str) -> dict:
    resp = requests.get(
        url,
        timeout=30,
        headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
    )
    html = resp.text
    if "h-captcha" in html or "g-recaptcha" in html:
        match = SITEKEY_RE.search(html)
        return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
    return {"captcha": False, "sitekey": None, "html": html}

page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
    print("captcha found, sitekey:", page["sitekey"])

Ciągi h-captcha i g-recaptcha to tylko znaczniki, których używa strona, więc jest to sygnał, a nie gwarancja. Jeśli sitekey brakuje, zobacz jak znaleźć sitekey captcha.

Rozwiąż, gdy nie da się tego uniknąć

Gdy na stronie jest widget PopularCaptcha i masz jego sitekey, możesz poprosić API Scarnox o token jednym żądaniem POST i wysłać go w polu h-captcha-response. Pełna funkcja, z obsługą błędów, znajduje się w rozwiąż captcha z Pythona jednym żądaniem. Użyj tokena od razu, bo wygasa po około dwóch minutach. Szczegóły czasu opisuje wygasły token captcha.

Obsługa Scarnox na żywo to dziś PopularCaptcha, proxyless i z własnym proxy. reCAPTCHA v2 i v3, Cloudflare Turnstile, GeeTest, AWS WAF i Arkose są wkrótce. Jeśli twój cel używa któregoś z nich, przewodniki o captcha opisują ogólne opcje, ale nie buduj produkcyjnego przepływu na rozwiązaniu, które nie działa na żywo.

Decyzja dla każdej zablokowanej strony

Gdy scraper trafia na captcha, prosta kolejność decyzji utrzymuje zadanie uczciwym i ogranicza liczbę żądań:

  1. Czy jest źródło danych, którego możesz użyć zamiast? Jeśli API, feed lub eksport obejmuje pola, których potrzebujesz, przełącz się na nie i przestań żądać tej strony.
  2. **Czy robots.txt zezwala na tę ścieżkę?** Jeśli nie, pomiń ją. Nie rozwiązuj captcha na stronie, o którą cię poproszono, żebyś zostawił ją w spokoju.
  3. Czy wysłałeś za dużo za szybko? Zrób dłuższą pauzę, obniż tempo i sprawdź ponownie później. Wiele captcha znika przy wolniejszym tempie.
  4. Czy captcha jest typem obsługiwanym na żywo? Jeśli to PopularCaptcha, zastosuj rozwiązanie z tego przewodnika. Jeśli to typ, który jest wkrótce, wstrzymaj zadanie i monitoruj wydanie.
  5. Czy to strona, którą wolno ci automatyzować? Jeśli odpowiedź nie jest jasna, zapytaj właściciela strony, zanim pójdziesz dalej.

Czwarty krok to ten, który najczęściej się pomija. Solver jest użyteczny tylko wtedy, gdy typ captcha jest obsługiwany, a zadanie, które ponawia nieobsługiwany typ, marnuje czas i żądania.

Obsługuj captcha w zadaniu, a nie w pętli

Umieść rozwiązanie w ścieżce kodu, która potrzebuje tokena, tak aby zadanie mogło zapisać każdą captcha, zatrzymać się, gdy strona ciągle zawodzi, i przejść dalej. Nieograniczona pętla, która ciągle żąda strony z captcha, to najszybszy sposób, by firewall witryny zablokował twój adres na stałe.

Monitoruj, co zawodzi

Prowadź licznik stron zwracających captcha, pogrupowany według adresu URL i pory dnia. Captcha, która pojawia się tylko w jednej sekcji witryny albo tylko po pewnej liczbie żądań, wskazuje, gdzie jest wyzwalacz. Ta informacja jest bardziej przydatna niż szybszy solver, bo pokazuje, co zmienić.

Czego nie robić

Scrapuj odpowiedzialnie

Dalsze kroki