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:
- wysyła żądania szybciej, niż mógłby klikać człowiek;
- powtarza tę samą ścieżkę bez przerwy;
- przychodzi z adresu centrum danych, a nie z domowej sieci;
- wysyła nagłówki, które nie pasują do popularnej przeglądarki, albo
- nie zachowuje ciasteczek ani stanu sesji między żądaniami.
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ń:
- 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.
- **Czy
robots.txtzezwala 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. - 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.
- 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.
- 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ć
- Nie rotuj wieloma adresami IP, żeby ominąć limity witryny. To unikanie wykrycia, które zamienia prośbę o zwolnienie w walkę.
- Nie scrapuj stron za logowaniem z danymi, do których nie masz autoryzacji.
- Nie rozwiązuj captcha, żeby zakładać konta, wysyłać spam lub kupować towary z ograniczoną dostępnością.
Scrapuj odpowiedzialnie
- Przeczytaj
robots.txti regulamin witryny przed rozpoczęciem. Szanuj zakazane ścieżki i wszelkie opóźnienie crawla. - Identyfikuj swojego bota uczciwie w User-Agent, z możliwością kontaktu.
- Utrzymuj niskie tempo żądań. Captcha to często strona prosząca cię o zwolnienie.
- Zatrzymaj się, jeśli strona cię o to poprosi, i nie obchodź blokady, o której ci powiedziano, żeby ją respektować.
- Obchodź się z danymi osobowymi zgodnie z zasadami prywatności, które cię obowiązują, i zbieraj tylko to, czego potrzebujesz.