Come diagnosticare la causa del basso success rate: guida passo dopo passo
Il success rate è la percentuale di richieste riuscite rispetto al numero totale di tentativi. Quando questo indicatore scende al di sotto della norma, si perdono soldi, tempo e dati. Ma le cause possono essere decine: da una configurazione errata ai blocchi del server di destinazione. In questo articolo analizzeremo un approccio sistematico alla diagnosi e troveremo una soluzione.
Cos'è il success rate e quale norma
Success rate (SR) = (Richieste riuscite / Numero totale di richieste) × 100%
I valori normali dipendono dal tipo di compito:
| Compito | SR normale | Livello critico |
|---|---|---|
| Parsing di dati pubblici | 95–99% | sotto l'85% |
| Automazione SMM | 90–97% | sotto l'80% |
| Verifica degli annunci | 98–99.5% | sotto il 95% |
| Integrazione API | 99–99.9% | sotto il 98% |
Se il SR è sceso del 5–10% dalla tua linea di base, è un segnale per la diagnosi. Se è sceso del 20%+ è necessario agire immediatamente.
Primi passi della diagnosi
Passaggio 1: Controlla i log e le metriche
Raccogli i dati degli ultimi 24–72 ore:
- Quando esattamente è sceso il SR? (ora esatta)
- Quale percentuale di richieste restituisce l'errore 407 (Proxy Authentication Required)?
- Quale percentuale — 429 (Too Many Requests)?
- Quale percentuale — timeout (connection timeout)?
- Il carico è cambiato (RPS — richieste al secondo)?
Passaggio 2: Testa in isolamento
Usa uno script semplice per verificare il proxy senza la tua applicazione:
import requests
import time
proxy = "http://proxy_ip:port"
proxies = {"http": proxy, "https": proxy}
target_url = "https://httpbin.org/ip"
success = 0
failed = 0
for i in range(100):
try:
response = requests.get(
target_url,
proxies=proxies,
timeout=10,
verify=False
)
if response.status_code == 200:
success += 1
print(f"✓ Tentativo {i+1}: successo")
else:
failed += 1
print(f"✗ Tentativo {i+1}: stato {response.status_code}")
except Exception as e:
failed += 1
print(f"✗ Tentativo {i+1}: {str(e)}")
time.sleep(0.5)
sr = (success / (success + failed)) * 100
print(f"\nSuccess Rate: {sr:.1f}%")
print(f"Riusciti: {success}, Errori: {failed}")
Se questo test mostra un SR normale, il problema è nel tuo codice o nella configurazione. Se il SR è basso anche qui, il problema è nel proxy o nel server di destinazione.
Problemi dal lato del proxy
Errore 407: Proxy Authentication Required
Cause:
- Credenziali errate (login/password)
- Account scaduto
- Indirizzo IP non nella whitelist (se richiesto)
- La rotazione IP non funziona o è disabilitata
Soluzione:
import requests
# Formato corretto per proxy residenziali
proxy = "http://login:password@proxy-host:port"
proxies = {"http": proxy, "https": proxy}
# Test
response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(response.text)
Sovraccarico del server proxy
Se tutti gli utenti del servizio inviano un'enorme quantità di richieste contemporaneamente, potrebbe esserci un limite di RPS (richieste al secondo). È raro, ma accade.
Verifica:
- Il tuo RPS attuale al picco
- I limiti del tuo piano tariffario
- Ci sono errori 429 nei log
Soluzione: aggiungi un ritardo tra le richieste o aggiorna il piano tariffario.
Qualità degli indirizzi IP
Per i proxy residenziali un basso SR potrebbe significare che ti vengono ruotati indirizzi bloccati. Verifica:
- Quale percentuale di indirizzi IP restituisce 403 Forbidden?
- Si ripetono gli stessi indirizzi?
- C'è un pattern — un paese/regione funziona, un altro no?
Blocchi e filtri del server di destinazione
Errore 429: Too Many Requests
Il server di destinazione vede troppi richieste da un IP o in generale. Soluzioni:
- Aggiungi un ritardo: `time.sleep(random.uniform(1, 3))`
- Usa la rotazione IP: ogni richiesta — nuovo IP
- Riduci l'RPS: invia le richieste in sequenza, non in parallelo
- Aggiungi intestazioni realistiche: User-Agent, Referer, Accept-Language
Errore 403 Forbidden
Il server ha bloccato il tuo IP (o l'IP del proxy). Questo potrebbe essere:
- Filtro per geolocalizzazione
- Lista nera dei servizi proxy
- Rilevatore di bot (JavaScript, CAPTCHA)
Soluzione: usa proxy mobili o proxy residenziali con rotazione. Sono più difficili da bloccare.
Errore 403: Verifica User-Agent
Alcuni servizi rifiutano le richieste con User-Agent sospetti:
import requests
import random
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15"
]
headers = {
"User-Agent": random.choice(user_agents),
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml",
"Referer": "https://google.com"
}
response = requests.get(
"https://target-site.com",
headers=headers,
proxies={"http": proxy, "https": proxy},
timeout=10
)
print(response.status_code)
Errori nel codice del client
Gestione errata delle eccezioni
Errore comune: il codice considera un errore di connessione come una richiesta non riuscita, ma non tenta di riconnettersi:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# Modo corretto con retry
session = requests.Session()
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["GET", "POST"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
try:
response = session.get(url, proxies=proxies, timeout=10)
except requests.exceptions.RequestException as e:
print(f"Errore: {e}")
# Registra e passa alla richiesta successiva
Timeout errati
Se il timeout è troppo breve (1–2 secondi), i proxy lenti verranno rifiutati:
- Per il parsing normale: 10–30 secondi
- Per proxy mobili: 15–45 secondi
- Per API: 5–10 secondi
Errori SSL/TLS
Se usi `verify=False`, questo potrebbe mascherare i problemi reali. È meglio aggiornare i certificati:
import requests
import certifi
# Corretto
response = requests.get(
url,
proxies=proxies,
verify=certifi.where(), # Invece di verify=False
timeout=15
)
Problemi di rete e timeout
Connection timeout vs Read timeout
La differenza è importante:
- Connection timeout: il proxy non risponde (problema con il proxy o la rete)
- Read timeout: il server di destinazione invia i dati lentamente (problema del server di destinazione)
import requests
# timeout = (connection_timeout, read_timeout)
try:
response = requests.get(
url,
proxies=proxies,
timeout=(5, 15) # 5 sec per la connessione, 15 per la lettura
)
except requests.exceptions.ConnectTimeout:
print("Il proxy non risponde")
except requests.exceptions.ReadTimeout:
print("Il server di destinazione è lento")
Problemi DNS
Se il server di destinazione non si risolve, non è un errore del proxy:
import socket
# Controlla il DNS senza proxy
try:
ip = socket.gethostbyname("target-site.com")
print(f"Si risolve: {ip}")
except socket.gaierror:
print("Errore DNS — sito non trovato")
Checklist di diagnosi del basso SR
- Stabilisci una linea di base: quale SR era normale prima?
- Esegui un test isolato (script sopra) con 100 richieste
- Controlla i log: quali codici HTTP dominano? (407, 429, 403, timeout?)
- Se 407: verifica login/password e whitelist IP
- Se 429: aggiungi ritardo tra le richieste, usa rotazione IP
- Se 403: verifica User-Agent, Referer, aggiungi intestazioni realistiche
- Se timeout: aumenta il timeout, controlla l'RPS, usa logica di retry
- Controlla il tuo codice: corretta gestione delle eccezioni, timeout corretti
- Controlla il server di destinazione: è accessibile direttamente (senza proxy)?
- Se tutto il resto non aiuta: prova un diverso tipo di proxy o un diverso provider
Tabella di diagnosi rapida
| Codice HTTP | Causa probabile | Soluzione |
|---|---|---|
| 407 | Credenziali proxy errate | Verifica login/password, whitelist IP |
| 429 | Troppe richieste | Aggiungi ritardo, usa rotazione IP |
| 403 | IP bloccato o rilevatore di bot | Aggiungi intestazioni realistiche, usa proxy mobili |
| Timeout | Proxy lento o server di destinazione sovraccarico | Aumenta il timeout, controlla l'RPS |
| Connection refused | Server proxy non disponibile | Verifica IP:port, stato del proxy |
Conclusioni
Un basso success rate è un sintomo, non una malattia. Le cause possono essere molte: da un errore di battitura nel codice al blocco da parte del server di destinazione. La diagnosi sistematica è la chiave per la soluzione:
- Controlla le metriche e i log
- Isola il problema (proxy vs server di destinazione vs tuo codice)
- Determina il tipo di errore (407, 429, 403, timeout)
- Applica la soluzione corrispondente
Per compiti che richiedono affidabilità e alto SR, si consigliano proxy residenziali con rotazione IP. Sono più difficili da rilevare e più stabili. Prova il test gratuito su proxycove.com e testa sul tuo compito.