Risposta rapida
Come funzionano sessioni sticky e rotazione IP su un proxy residenziale?
Su CrawlRelay, un nome utente senza ID sessione riceve un IP dal pool ad ogni nuova connessione TCP, di solito diverso, e -session-<id>-ttl-<minutes> mantiene lo stesso IP per quell’ID per fino a 30 minuti, anche se l’IP può cambiare prima. La rotazione segue le connessioni, non le richieste HTTP, quindi il keep-alive decide quando cambi realmente IP. Il traffico residenziale costa 0,50 USD/GB da 50 GB. Pagamento in criptovalute, senza KYC.
Regole di sessione in sintesi
| Unità di rotazione | Un IP dal pool per ogni nuova connessione TCP, di solito diverso |
|---|---|
| Sessione sticky | -session-<id>-ttl-<minutes> aggiunto al nome utente |
| Durata sessione | fino a 30 minuti |
| ID sessione | 1–32 lettere o cifre; un ID per flusso |
| Cosa termina una sessione anticipatamente | Il dispositivo residenziale dietro che va offline |
| ID condivisi | I clienti che inviano lo stesso ID condividono la stessa uscita |
| Costo | Nessuno: sessioni e rotazione sono incluse nel prezzo per GB |
Cosa succede al gateway quando invio un ID di sessione?
Il gateway legge il nome utente ad ogni nuova connessione. Senza una parte di sessione, seleziona un'uscita proxy residenziale che corrisponde al tuo targeting solo per quella connessione. Con una parte di sessione, mantiene la stessa uscita per quell'ID fino al TTL che imposti.
Un IP persistente è una vera connessione domestica, quindi può scomparire prima che il TTL termini: il dispositivo può essere spento, perdere il Wi-Fi o cambiare rete. Flussi lunghi devono sopravvivere a ciò, verificando l'IP di uscita a checkpoint e ripartendo da un checkpoint invece di fallire l’intero lavoro.
Come riutilizza le connessioni ogni libreria?
Se una libreria mantiene una connessione attiva, ogni richiesta su di essa condivide un'uscita. Ecco come ottenere ogni comportamento in modo intenzionale.
| Libreria | Predefinito | Nuovo IP per richiesta | Un indirizzo IP per un flusso |
|---|---|---|---|
| Python requests | Session mantiene le connessioni attive | Header Connection: close, o un nuovo Session per richiesta | Un Session con un ID sessione nel nome utente |
| httpx | Il client gestisce pool di connessioni | httpx.Limits(max_keepalive_connections=0) | Un client per ogni ID sessione |
| aiohttp | TCPConnector gestisce pool di connessioni | TCPConnector(force_close=True) | ID sessione nell’username dell’URL del proxy |
| Scrapy | Pool per credenziali proxy e host | meta={"proxy_session": "new"} con il nostro middleware | Un proxy_session fisso per il flusso |
| Playwright / Puppeteer | Chrome gestisce pool per contesto | Nuovo contesto per pagina | Un contesto per ogni ID sessione |
| Node.js undici, axios, got | Gli agenti mantengono socket attivi | Nuovo agente per richiesta, o keep-alive disattivato | Un agente per ogni ID sessione |
| curl | Una connessione per comando | Già così | Stesso ID sessione in ogni comando |
Quale strategia di sessione si adatta a quale lavoro di scraping?
| Lavoro | Strategia | TTL suggerito |
|---|---|---|
| Pagine prodotto indipendenti, articoli o liste | Ruota: nessun ID sessione | — |
| Paginazione la cui pagina successiva dipende da un cookie o cursore | Una sessione sticky per ogni annuncio | 10–30 min |
| Cerca, poi risultati, poi pagine di dettaglio | Una sessione sticky per ogni ricerca | 10–20 min |
| Rendering con browser headless di diverse pagine di un sito | Una sessione sticky per ogni contesto browser | Durata del contesto, fino a 30 min |
| Verifica di cosa mostra una pagina in diverse città | Una sessione breve per ogni controllo città | 5 min |
| Ricontrollare la stessa pagina ogni ora | Ruota | — |
Come gestisco un pool di sessioni sticky in Python?
Un piccolo pool distribuisce il carico su alcune uscite stabili e ritira ciascuna dopo un numero prefissato di richieste o dopo un segnale che la sua uscita sta fallendo, come 502 o 503. Nota cosa non fa: non cambia IP per superare un 403 o un 429. Significano che il sito vuole che rallenti, quindi il pool li passa al tuo codice.
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)Come faccio a sapere se un IP sticky è cambiato?
Chiedilo. Richiedi un servizio di eco IP come https://api.ipify.org usando la stessa sessione all'inizio di un flusso e a ogni checkpoint, quindi confronta le risposte. Un cambiamento significa che l'uscita dietro la sessione è cambiata: riavvia il flusso dal suo ultimo checkpoint oppure apri una nuova sessione. Registralo con l'ID sessione così puoi distinguere i cambi IP dal comportamento del sito durante il debug.
Quali errori nelle sessioni costano di più?
- Ruotare ad ogni richiesta di un flusso a più step. Il sito vede un carrello, un cursore o un token di ricerca saltare tra paesi e lo resetta.
- Un ID sessione per ogni worker. Una sessione serve per un solo flusso; assegna a ogni worker e flusso un proprio ID.
- Sessioni troppo lunghe rispetto al lavoro. Un TTL di 30 minuti per un flusso di 2 minuti occupa inutilmente un IP e rende i log più difficili da leggere.
- Trattare un 429 come un problema IP. Un nuovo IP non cambia la regola del sito; rallentare sì. Vedi 429 Too Many Requests.
- Assumere rotazione a ogni richiesta. Keep-alive mantiene l'uscita; consulta la tabella sopra per la tua libreria.
Sessioni e rotazione: domande
Quanto dura una sessione sticky?
Le sessioni sticky mantengono lo stesso IP per il tempo impostato (ttl, in minuti), fino a 30 minuti. L’IP può cambiare prima, per esempio se il dispositivo residenziale va offline. Scegli un TTL leggermente più lungo del flusso che serve e verifica l'uscita ai checkpoint.
Una sessione sticky costa di più della rotazione?
No. CrawlRelay fattura il traffico per GB, e sessioni, rotazioni e targeting sono inclusi nel prezzo. Una sessione sticky può anche risparmiare traffico, perché una connessione mantenuta evita un nuovo handshake TLS a ogni richiesta.
Ruotare ad ogni richiesta è meglio per lo scraping?
Per pagine indipendenti, ruotare distribuisce il carico ed evita di colpire un sito da un unico IP per ore. Per qualsiasi cosa con stato, come la paginazione legata a un cookie, rompe il flusso. La maggior parte dei crawling mescola entrambi: ruota tra gli elementi, resta sticky all'interno di un flusso.
Posso scegliere esattamente l'IP che ottengo?
No. Un gateway residenziale assegna uscite da un pool che cambia continuamente, seguendo il targeting del tuo username. Scegli paese, città, stato USA, CAP o ASN e puoi mantenere un IP con una sessione; non puoi riservare un indirizzo specifico.
Rotazione e sessioni sono in ogni piano
1,50 USD per 1 GB, 0,50 USD/GB da 50 GB.