Bez KYC — brak dowodu, selfie i dokumentów. Płać w kryptowalutach: BTC, USDT, USDC, ETH, SOL, LTC
Język: Polski
Rozpocznij

Dokumentacja · sesje · rotacja · utrzymanie połączenia

Stałe sesje i rotacja IP: ID sesji, TTL i ponowne użycie połączenia

Rotacja działa na poziomie połączenia, trwałość sesji na poziomie ID sesji. Gdy wiesz, jak Twoja biblioteka używa połączeń, możesz precyzyjnie zdecydować, kiedy IP się zmienia.

Ostatnia aktualizacja: · 5 min czytania

Szybka odpowiedź

Jak działają stałe sesje i rotacja IP na proxy rezydencjalnym?

Na CrawlRelay, nazwa użytkownika bez ID sesji dostaje IP z puli przy każdym nowym połączeniu TCP, zwykle inne, a -session-<id>-ttl-<minutes> trzyma jedno IP dla tego ID przez do 30 minut, choć IP może się zmienić wcześniej. Rotacja dotyczy połączeń, nie żądań HTTP, więc utrzymanie połączenia decyduje, kiedy IP naprawdę się zmienia. Ruch proxy rezydencjalnego kosztuje 0,50 USD/GB od 50 GB. Płatne w crypto, bez KYC.

Zasady sesji w pigułce

Jednostka rotacjiIP z puli na każde nowe połączenie TCP, zwykle inne
Sesja stała-session-<id>-ttl-<minutes> dodane do nazwy użytkownika
Długość sesjido 30 minut
ID sesji1–32 litery lub cyfry; jedno ID na przepływ
Co kończy sesję wcześniejUrządzenie rezydencjalne stojące za nią tracące połączenie
Wspólne IDKlienci wysyłający to samo ID korzystają z tego samego exit
KosztBrak: sesje i rotacja są wliczone w cenę za GB

Co się dzieje na bramce, gdy wysyłam ID sesji?

Bramka odczytuje nazwę użytkownika przy każdym nowym połączeniu. Bez części sesji wybiera proxy rezydencjalne, które pasuje do Twojego targetowania tylko dla tego połączenia. Z częścią sesji utrzymuje ten sam exit dla tego ID przez ustalony przez Ciebie TTL.

Sticky IP to prawdziwe łącze domowe, które może zniknąć przed końcem TTL: urządzenie jest wyłączone, traci Wi-Fi lub zmienia sieć. Długie sesje muszą to przetrwać, sprawdzając IP wyjścia na checkpointach i restartując od checkpointu zamiast przerywać całe zadanie.

Jak każda biblioteka ponownie wykorzystuje połączenia?

Jeśli biblioteka utrzymuje połączenie przy życiu, każde żądanie na nim korzysta z jednego exit. Dzięki temu możesz świadomie uzyskać każdy z tych zachowań.

BibliotekaDomyślnieNowe IP przy każdym żądaniuJeden IP na flow
Python requestsSession utrzymuje połączenia przy życiuNagłówek Connection: close lub nowy Session dla każdego żądaniaJeden Session z ID sesji w nazwie użytkownika
httpxKlient grupuje połączeniahttpx.Limits(max_keepalive_connections=0)Jeden klient na ID sesji
aiohttpTCPConnector grupuje połączeniaTCPConnector(force_close=True)ID sesji w nazwie użytkownika proxy w URL
ScrapyGrupy według danych uwierzytelniających proxy i hostameta={"proxy_session": "new"} z naszym middlewareStały proxy_session dla flow
Playwright / PuppeteerChrome grupuje według kontekstuNowy kontekst na stronęJeden kontekst na ID sesji
Node.js undici, axios, gotAgenci utrzymują gniazda otwarteNowy agent na żądanie lub wyłączone keep-aliveJeden agent na ID sesji
curlJedno połączenie na komendęJuż tak jestTo samo ID sesji w każdej komendzie

Która strategia sesji pasuje do jakiego zadania scrapowania?

ZadanieStrategiaSugerowany TTL
Niezależne strony produktów, artykułów lub listingówRotacja: brak ID sesji—
Paginacja, gdzie następna strona zależy od ciasteczka lub kursoraJedna sesja rezydencjalna na listing10–30 min
Wyszukiwanie, potem wyniki, potem strony szczegółówJedna sesja rezydencjalna na wyszukiwanie10–20 min
Renderowanie bezgłowej przeglądarki kilku stron jednego serwisuJedna sesja rezydencjalna na kontekst przeglądarkiCzas życia kontekstu, do 30 min
Sprawdzanie, co strona pokazuje w różnych miastachJedna krótka sesja na sprawdzenie miasta5 min
Ponowne sprawdzanie tej samej strony co godzinęRotacja—

Jak zarządzać pulą sesji rezydencjalnych w Pythonie?

Mała pula rozkłada obciążenie na kilka stabilnych wyjść i wycofuje każde po określonej liczbie żądań lub po sygnale awarii wyjścia, np. 502 lub 503. Uwaga na to, czego nie robi: nie zmienia IP, by obejść 403 lub 429. To oznacza, że strona chce, byś zwolnił, więc pula przekazuje ich do twojego kodu.

Python: pula sesji rezydencjalnych
import random
import uuid

import requests

GATEWAY = "gw.crawlrelay.com:7777"
BASE_USER, PASSWORD = "USERNAME-country-us", "PASSWORD"


class SlowDown(Exception):
    """The target asked us to slow down (403 or 429): back off, do not rotate."""


class StickySession:
    def __init__(self, ttl=15, max_requests=50):
        self.id = uuid.uuid4().hex[:10]
        self.max_requests, self.used = max_requests, 0
        user = "%s-session-%s-ttl-%d" % (BASE_USER, self.id, ttl)
        proxy = "http://%s:%s@%s" % (user, PASSWORD, GATEWAY)
        self.http = requests.Session()
        self.http.proxies = {"http": proxy, "https": proxy}


class SessionPool:
    EXIT_PROBLEMS = {502, 503, 504}

    def __init__(self, size=5, **options):
        self.options = options
        self.sessions = [StickySession(**options) for _ in range(size)]

    def _replace(self, i):
        self.sessions[i].http.close()
        self.sessions[i] = StickySession(**self.options)

    def get(self, url, **kwargs):
        i = random.randrange(len(self.sessions))
        s = self.sessions[i]
        s.used += 1
        try:
            r = s.http.get(url, timeout=(10, 30), **kwargs)
        except requests.exceptions.RequestException:
            self._replace(i)  # dropped exit or timeout: start a fresh session
            raise
        if r.status_code in (403, 429):
            raise SlowDown("%s returned %d" % (url, r.status_code))
        if r.status_code in self.EXIT_PROBLEMS or s.used >= s.max_requests:
            self._replace(i)
        return r


pool = SessionPool(size=5, ttl=15, max_requests=50)
print(pool.get("https://api.ipify.org").text)

Jak sprawdzić, czy zmieniło się IP w sesji rezydencjalnej?

Zapytaj. Wywołaj serwis echo IP, np. https://api.ipify.org przez tę samą sesję na początku i na każdym punkcie kontrolnym, porównaj odpowiedzi. Zmiana oznacza, że wyjście sesji się zmieniło: zacznij od ostatniego punktu kontrolnego lub otwórz nową sesję. Zaloguj to z ID sesji, aby rozróżnić zmiany IP od zachowania strony podczas debugowania.

Jakie błędy sesji kosztują najwięcej?

  • Rotowanie przy każdym żądaniu wieloetapowego procesu. Strona widzi, jak koszyk, kursor lub token wyszukiwania skacze po krajach i resetuje go.
  • Jedno ID sesji na każdego worker’a. Sesja jest na jeden flow; daj każdemu workerowi i flow własne ID.
  • Sesje dużo dłuższe niż zadanie. TTL 30 minut dla 2-minutowego flow zajmuje IP na darmo i utrudnia czytanie logów.
  • Traktowanie 429 jako problem IP. Nowe IP nie zmienia zasad serwisu; trzeba zwolnić. Zobacz 429 Too Many Requests.
  • Zakładanie rotacji przy każdym żądaniu. Keep-alive utrzymuje wyjście; sprawdź tabelę powyżej dla swojej biblioteki.

Sesje i rotacja: pytania

Jak długo trwa sesja rezydencjalna?

Sticky sessions utrzymują ten sam IP przez czas ustawiony (ttl, w minutach) do 30 minut. IP może się zmienić wcześniej, np. gdy urządzenie rezydencjalne jest offline. Wybierz TTL trochę dłuższy niż flow, który obsługuje, i sprawdzaj wyjście na punktach kontrolnych.

Czy sesja rezydencjalna kosztuje więcej niż rotacja?

Nie. CrawlRelay liczy ruch za GB, a sesje, rotacja i targetowanie są w tej cenie. Sesja rezydencjalna może nawet oszczędzać ruch, bo jedno połączenie keep-alive unika nowego handshake TLS na każde żądanie.

Czy rotacja przy każdym żądaniu jest lepsza do scrapingu?

Dla niezależnych stron rotacja rozkłada obciążenie i unika długiego korzystania z jednego IP na jednej stronie. Dla czegokolwiek ze stanem, jak paginacja z ciasteczkiem, psuje flow. Większość crawlów miesza oba: rotuje między elementami, a pozostaje rezydencjalna wewnątrz flow.

Czy mogę wybrać dokładne IP?

Nie. Brama proxy rezydencjalnego przydziela wyjścia z puli, która ciągle się zmienia, w zależności od targetowania w twojej nazwie użytkownika. Wybierasz kraj, miasto, stan USA, kod pocztowy lub ASN i możesz utrzymać IP w sesji; nie możesz zarezerwować konkretnego adresu.

Rotacja i sesje w każdym planie

1,50 USD za 1 GB, 0,50 USD/GB od 50 GB.

Od 0,50 USD/GB · bez KYC

Rozpocznij