Scarnox · Blog

Rotujące proxy do scrapingu: konfiguracja i pułapki

Rotujące proxy zmienia adres IP, z którego wychodzi twój ruch, albo na każde żądanie, albo po ustalonym czasie. To jedno z najczęściej używanych narzędzi w web scrapingu i jedno z najczęściej nadużywanych. Rotujesz za mało, a pojedynczy adres dostaje limit żądań. Rotujesz za dużo, a ruch wygląda zupełnie nie jak odwiedzający. Ten przewodnik wyjaśnia dwa modele rotacji, pokazuje działającą konfigurację w Pythonie z ponowieniami dla martwych proxy i omawia, jak pole proxy pasuje do rozwiązywania captcha.

Rotacja a sesje sticky

Usługa rotującego proxy wydaje adresy na dwa sposoby:

Prawdziwy odwiedzający zachowuje jeden adres przez całą wizytę. Sesje sticky odzwierciedlają to zachowanie, więc zwykle są lepszym domyślnym wyborem, gdy strona używa ciasteczek lub sesji. Rotacji na każde żądanie używaj do przeszukiwania bez stanu.

Podstawowa pula rotujących proxy w Pythonie

Poniższy przykład przechowuje pulę adresów proxy, rotuje przez nie i przechodzi dalej, gdy jeden zawiedzie. Trzymaj dane logowania w zmiennych środowiskowych, nigdy w kodzie źródłowym.

import itertools
import os
import requests

# Adresy proxy pochodzą ze środowiska, na przykład:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)

def fetch(url: str, max_tries: int = 3) -> requests.Response:
    last_error = None
    for _ in range(max_tries):
        proxy = next(rotation)
        try:
            r = requests.get(
                url,
                proxies={"http": proxy, "https": proxy},
                timeout=30,
            )
            if r.status_code == 407:  # uwierzytelnienie proxy odrzucone
                raise requests.RequestException("proxy auth rejected")
            return r
        except requests.RequestException as exc:
            last_error = exc  # martwe lub wolne proxy: spróbuj następnego
    raise RuntimeError(f"all attempts failed for {url}: {last_error}")

Dwa szczegóły mają znaczenie. Po pierwsze, martwe proxy należy ponowić na innym adresie, a nie na tym samym. Po drugie, żądanie zakończone błędem uwierzytelnienia powinno się zatrzymać i zostać zgłoszone, zamiast przepalać całą pulę.

Monitoruj kondycję proxy

Zwykłe round robin wciąż wysyła ruch do proxy, które zaczęło zawodzić. Prowadź prosty wynik dla każdego adresu: licz ostatnie błędy i wyrzucaj adres z puli na okres ochłonięcia, gdy przekroczy próg. Po jakimś czasie przywróć go i obserwuj ponownie. Twój scraper wtedy wydaje żądania na zdrową część puli.

Zapisuj proxy użyte przy każdym wyniku. Gdy strona zaczyna zwracać blokady, będziesz chciał wiedzieć, czy winny jest jeden adres, jeden region, czy cała pula.

Dozuj tempo puli

Rotacja rozkłada obciążenie na adresy, ale każdy adres ma wciąż swój limit. Ustaw opóźnienie na adres i globalny limit liczby żądań na sekundę dla całej puli. Rotacja nie jest licencją na wysyłanie większego ruchu. To sposób na utrzymanie ruchu z jednego adresu w rozsądnych granicach.

Typowe błędy

Większość problemów z rotacją wynika z kilku nawyków. Zmiana adresu w środku logowania albo procesu zakupowego psuje sesję i sprawia, że strona staje się podejrzliwa. Odpowiedź 429 to limit po stronie witryny, a nie zepsute proxy, więc przełączenie na nowy adres i natychmiastowe ponowienie tylko rozprzestrzenia problem. Zmiana adresu przy każdym żądaniu przy zachowaniu tych samych ciasteczek też jest niespójna, bo ciasteczka zostały wydane innemu odwiedzającemu. Wreszcie pula, której nigdy nie sprawdzasz, po cichu zapełni się martwymi adresami, a wskaźnik błędów wzrośnie bez oczywistej przyczyny. Sprawdzaj pulę według harmonogramu i usuwaj to, co zawodzi.

Proxy a rozwiązywanie captcha

Niektóre zadania captcha mogą używać proxy, którego używa twój scraper. Przekazujesz je w opcjonalnym polu proxy, w postaci http://user:pass@host:port, a rozwiązanie odbywa się tą samą ścieżką sieciową, co żądanie strony. Zadania proxyless pomijają to pole. To, który wybrać, zależy od tego, czy strona wiąże captcha z adresem sieciowym, a ten kompromis wyjaśnia proxy a proxyless w captcha.

Dwie praktyczne uwagi:

Typ captcha obsługiwany dziś w Scarnox to PopularCaptcha. Przewodnik PopularCaptcha w Pythonie pokazuje żądanie i sposób wysłania zwróconego tokena.

Wybór proxy

Typ rotowanych adresów ma tak samo duże znaczenie jak sama rotacja. Adresy z centrów danych są szybkie i tanie na żądanie, ale często dostają niski wynik. Adresy rezydencjalne mają lepszy wynik i są wolniejsze. Proxy rezydencjalne a datacenter porównuje je dokładniej, a tamtejsze porady dotyczą też puli, którą budujesz tutaj.

Scrapuj odpowiedzialnie

Dalsze kroki

Zacznij z darmowym kredytem próbnym, bez karty: załóż konto i przetestuj przepływ PopularCaptcha z własnym proxy. Aktualne stawki znajdziesz na stronie cennika.