[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-it-scraping-binance-rest-api-con-proxy":3},{"success":4,"payload":5,"related":62,"errors":127},true,{"id":6,"slug":7,"title":8,"excerpt":9,"body_html":10,"meta_title":11,"meta_description":12,"canonical_url":13,"canonical_override":14,"og_title":11,"og_description":12,"og_image_url":15,"faq_json":16,"key_takeaways":14,"allow_index":29,"noindex_google_only":29,"allow_follow":4,"published_at":30,"updated_at":30,"content_updated_at":31,"featured_image_url":32,"featured_image_alt":33,"card_image_url":34,"reading_time_minutes":35,"author":36,"categories":40,"tags":47,"alternates":48,"locale_paths":55,"views":61},194,"scraping-binance-rest-api-con-proxy","Come fare scraping della Binance REST API con proxy: guida per sviluppatori","Guida pratica per raccogliere dati di mercato pubblici da Binance tramite proxy rotanti: endpoint, pesi, rate limit, esempi in Python e Node.js con il SDK ProxyHat.","\u003Ch2>Come fare scraping della Binance REST API con proxy: panoramica rapida\u003C\u002Fh2>\u003Cp>Raccogliere dati di mercato pubblici da Binance è apparentemente semplice — gli endpoint REST sono pubblici, ben documentati e non richiedono chiavi API per i dati di prezzo e order book. Il problema nasce quando si tenta di farlo \u003Cstrong>su larga scala\u003C\u002Fstrong>: Binance applica un rate limit basato su \u003Cem>peso\u003C\u002Fem> per IP, e un polling aggressivo di \u003Ccode>\u002Fapi\u002Fv3\u002Fdepth\u003C\u002Fcode> può esaurire il budget di circa 6.000 pesi al minuto in pochi cicli. La soluzione è distribuire il peso su più IP usando \u003Cstrong>proxy residenziali rotanti\u003C\u002Fstrong> come quelli di ProxyHat, che permette di superare sia i limiti di frequenza sia le restrizioni geografiche (HTTP 451) tra Binance.com e Binance.US.\u003C\u002Fp>\u003Cblockquote>\u003Cstrong>Nota su conformità e ToS:\u003C\u002Fstrong> questa guida riguarda esclusivamente \u003Cem>dati di mercato pubblici\u003C\u002Fem> (candlestick, order book top-of-book, ticker 24h, prezzo). Rispetta sempre i pesi documentati, leggi i \u003Ca href=\"https:\u002F\u002Fwww.binance.com\u002Fen\u002Fterms\" rel=\"noopener noreferrer\">Termini di servizio di Binance\u003C\u002Fa>, e preferisci l'accesso API ufficiale quando i termini lo richiedono. Non usare proxy per aggirare restrizioni legali o sanzioni.\u003C\u002Fp>\u003C\u002Fblockquote>\u003Ch2>Endpoint pubblici chiave e peso per richiesta\u003C\u002Fh2>\u003Cp>Binance pubblica un set di endpoint REST pubblici su \u003Ccode>api.binance.com\u003C\u002Fcode> (e mirror regionali). Ogni endpoint ha un \u003Cstrong>peso\u003C\u002Fstrong> (weight) che conta contro il budget orario e per-minuto dell'IP chiamante. La tabella seguente mappa i quattro endpoint più rilevanti per dataset di prezzo\u002Forderbook.\u003C\u002Fp>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Endpoint\u003C\u002Fth>\u003Cth>Scopo\u003C\u002Fth>\u003Cth>Peso tipico\u003C\u002Fth>\u003Cth>Note\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Ccode>GET \u002Fapi\u002Fv3\u002Fklines\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Candlestick OHLCV\u003C\u002Ftd>\u003Ctd>1–10 (dipende da limit)\u003C\u002Ftd>\u003Ctd>max 1000 candele per richiesta; peso cresce con \u003Ccode>limit\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>GET \u002Fapi\u002Fv3\u002Fdepth\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Snapshot order book\u003C\u002Ftd>\u003Ctd>5–20 (dipende da limit)\u003C\u002Ftd>\u003Ctd>limit=1000 → peso 20; limit=5000 → peso 50 (documentato)\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>GET \u002Fapi\u002Fv3\u002Fticker\u002F24hr\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Statistiche 24h per simbolo\u003C\u002Ftd>\u003Ctd>1 (singolo) – 80 (tutti i simboli)\u003C\u002Ftd>\u003Ctd>Chiamata senza simbolo restituisce tutti i ticker: peso alto\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>GET \u002Fapi\u002Fv3\u002Fticker\u002Fprice\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Prezzo spot corrente\u003C\u002Ftd>\u003Ctd>1–4\u003C\u002Ftd>\u003Ctd>Leggerissimo; ideale per heartbeat\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Cp>Ogni risposta REST include l'header \u003Ccode>X-MBX-USED-WEIGHT-1M\u003C\u002Fcode>, che indica il peso consumato nell'ultimo minuto per quell'IP. Monitorare questo header è obbligatorio per evitare ban: la documentazione ufficiale di \u003Ca href=\"https:\u002F\u002Fdevelopers.binance.com\u002Fdocs\u002Fbinance-spot-api-docs\u002Frest-api\" rel=\"noopener noreferrer\">Binance Spot API\u003C\u002Fa> descrive il sistema di peso in dettaglio.\u003C\u002Fp>\u003Ch2>Perché il rate limit basato su peso è insidioso\u003C\u002Fh2>\u003Cp>Il budget predefinito per IP è di 6.000 pesi al minuto (può variare; verifica l'header \u003Ccode>X-MBX-USED-WEIGHT-1M\u003C\u002Fcode>). Se fai polling di \u003Ccode>\u002Fapi\u002Fv3\u002Fdepth\u003C\u002Fcode> con \u003Ccode>limit=1000\u003C\u002Fcode> (peso 20) ogni secondo, consumi 1.200 pesi al minuto — apparentemente sotto soglia. Ma se aggiungi \u003Ccode>klines\u003C\u002Fcode> multi-simbolo e ticker 24h per decine di pair, il peso si somma rapidamente e il budget si esaurisce in pochi minuti.\u003C\u002Fp>\u003Cp>Quando superi il limite, Binance risponde con HTTP 429 Too Many Requests e l'header \u003Ccode>Retry-After\u003C\u002Fcode> (secondi di attesa). Se continui a forzare, l'IP viene bannato temporaneamente con HTTP 418 (un endpoint \"ban\" con corpo JSON \u003Ccode>{\"code\": -1003, \"msg\": ...}\u003C\u002Fcode>). I ban possono durare da 2 minuti a 3 giorni a seconda della gravità. Per un data pipeline in produzione, un ban significa gap nei dati e possibili perdite finanziarie per strategie quant.\u003C\u002Fp>\u003Cp>La geo-restrizione aggiunge un ulteriore livello: da alcuni IP (tipicamente Stati Uniti), \u003Ccode>api.binance.com\u003C\u002Fcode> può rispondere con HTTP 451 Unavailable For Legal Reasons, reindirizzando verso Binance.US (endpoint diversi, liquidità diversa). I proxy residenziali geolocalizzati risolvono entrambi i problemi: distribuiscono il peso su molti IP e permettono di scegliere il Paese di uscita.\u003C\u002Fp>\u003Ch2>Proxy residenziali ProxyHat: configurazione di base\u003C\u002Fh2>\u003Cp>ProxyHat espone un gateway unico (\u003Ccode>gate.proxyhat.com\u003C\u002Fcode>) su porta 8080 per HTTP e 1080 per SOCKS5. La rotazione e la geolocalizzazione si controllano tramite il \u003Cem>username\u003C\u002Fem>, con flag separati da trattino:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>user-country-US:pass\u003C\u002Fcode> — uscita da Stati Uniti (evita HTTP 451 su Binance.com)\u003C\u002Fli>\u003Cli>\u003Ccode>user-country-DE-region-state_of_berlin-city-berlin:pass\u003C\u002Fcode> — uscita da Berlino\u003C\u002Fli>\u003Cli>\u003Ccode>user-sid-abc123:pass\u003C\u002Fcode> — sessione sticky (stesso IP per più richieste)\u003C\u002Fli>\u003Cli>\u003Ccode>user-country-DE-sid-abc123:pass\u003C\u002Fcode> — combinazione geo + sticky\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Per backfill paginati di klines (dove serve coerenza e continuità di sessione), usa sessioni sticky; per polling distribuito di depth\u002Fticker, ruota per-request senza sessione.\u003C\u002Fp>\u003Ch2>Esempio 1: Python requests con proxy raw e rotazione per-request\u003C\u002Fh2>\u003Cp>Questo snippet mostra l'uso diretto del proxy HTTP ProxyHat con rotazione casuale della sessione (nuovo IP per ogni richiesta). Include lettura dell'header \u003Ccode>X-MBX-USED-WEIGHT-1M\u003C\u002Fcode>, retry con backoff esponenziale e gestione di 429\u002F418.\u003C\u002Fp>\u003Cpre>\u003Ccode>import requests\nimport time\nimport random\nimport logging\nfrom requests.adapters import HTTPAdapter\nfrom urllib3.util.retry import Retry\n\nlogging.basicConfig(level=logging.INFO, format=&quot;%(asctime)s %(levelname)s %(message)s&quot;)\n\nPROXYHAT_USER = &quot;user&quot;\nPROXYHAT_PASS = &quot;pass&quot;\nGATE = &quot;gate.proxyhat.com:8080&quot;\n\nBASE = &quot;https:\u002F\u002Fapi.binance.com&quot;\n\ndef build_proxy_url(country=None):\n    # Rotazione per-request: sessione casuale = nuovo IP ogni volta\n    session_id = f&quot;sess-{random.randint(0, 10_000_000)}&quot;\n    user = f&quot;{PROXYHAT_USER}-sid-{session_id}&quot;\n    if country:\n        user = f&quot;{PROXYHAT_USER}-country-{country}-sid-{session_id}&quot;\n    return f&quot;http:\u002F\u002F{user}:{PROXYHAT_PASS}@{GATE}&quot;\n\ndef fetch_klines(symbol=&quot;BTCUSDT&quot;, interval=&quot;1m&quot;, limit=500):\n    url = f&quot;{BASE}\u002Fapi\u002Fv3\u002Fklines&quot;\n    params = {&quot;symbol&quot;: symbol, &quot;interval&quot;: interval, &quot;limit&quot;: limit}\n    proxies = {&quot;http&quot;: build_proxy_url(&quot;DE&quot;), &quot;https&quot;: build_proxy_url(&quot;DE&quot;)}\n    for attempt in range(5):\n        try:\n            r = requests.get(url, params=params, proxies=proxies, timeout=10)\n            used = r.headers.get(&quot;X-MBX-USED-WEIGHT-1M&quot;, &quot;?&quot;)\n            logging.info(&quot;%s weight_used=%s status=%s&quot;, symbol, used, r.status_code)\n            if r.status_code == 429:\n                retry_after = int(r.headers.get(&quot;Retry-After&quot;, 5))\n                logging.warning(&quot;429 received, sleeping %ss&quot;, retry_after)\n                time.sleep(retry_after)\n                continue\n            if r.status_code == 418:\n                logging.error(&quot;418 ban — IP bloccato, pausa lunga&quot;)\n                time.sleep(60)\n                continue\n            r.raise_for_status()\n            return r.json()\n        except requests.RequestException as e:\n            backoff = 2 ** attempt\n            logging.warning(&quot;errore %s, retry in %ss&quot;, e, backoff)\n            time.sleep(backoff)\n    return None\n\nif __name__ == &quot;__main__&quot;:\n    data = fetch_klines()\n    print(f&quot;candele ricevute: {len(data) if data else 0}&quot;)\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>Esempio 2: Python httpx asincrono con ProxyHat SDK e throttling basato su peso\u003C\u002Fh2>\u003Cp>Per throughput più alto, \u003Ccode>httpx\u003C\u002Fcode> con async è preferibile. Qui usiamo il pattern SDK ProxyHat (costruzione dell'URL proxy) con un semaforo per limitare la concorrenza e un throttle che rispetta il peso cumulativo.\u003C\u002Fp>\u003Cpre>\u003Ccode>import asyncio\nimport httpx\nimport random\nimport logging\nimport time\n\nlogging.basicConfig(level=logging.INFO, format=&quot;%(asctime)s %(levelname)s %(message)s&quot;)\n\nPROXYHAT_USER = &quot;user&quot;\nPROXYHAT_PASS = &quot;pass&quot;\nGATE_HTTP = &quot;gate.proxyhat.com:8080&quot;\n\nBASE = &quot;https:\u002F\u002Fapi.binance.com&quot;\nMAX_CONCURRENCY = 10\nWEIGHT_BUDGET_PER_MIN = 5500  # margine sotto 6000\n\nclass WeightThrottle:\n    def __init__(self, budget_per_min):\n        self.budget = budget_per_min\n        self.consumed = 0\n        self.window_start = time.monotonic()\n        self.lock = asyncio.Lock()\n\n    async def acquire(self, weight=1):\n        async with self.lock:\n            now = time.monotonic()\n            if now - self.window_start &gt;= 60:\n                self.consumed = 0\n                self.window_start = now\n            if self.consumed + weight &gt; self.budget:\n                sleep_for = 60 - (now - self.window_start)\n                logging.warning(&quot;peso %s\u002F%s, attendo %.1fs&quot;, self.consumed, self.budget, sleep_for)\n                await asyncio.sleep(max(sleep_for, 0.5))\n                self.consumed = 0\n                self.window_start = time.monotonic()\n            self.consumed += weight\n\ndef proxy_url(country=&quot;DE&quot;, session=None):\n    sess = session or f&quot;sess-{random.randint(0, 10_000_000)}&quot;\n    user = f&quot;{PROXYHAT_USER}-country-{country}-sid-{sess}&quot;\n    return f&quot;http:\u002F\u002F{user}:{PROXYHAT_PASS}@{GATE_HTTP}&quot;\n\nasync def fetch_depth(client, symbol, throttle, limit=100):\n    weight = 1 if limit &lt;= 100 else 5  # approssimazione; vedi docs\n    await throttle.acquire(weight)\n    url = f&quot;{BASE}\u002Fapi\u002Fv3\u002Fdepth&quot;\n    params = {&quot;symbol&quot;: symbol, &quot;limit&quot;: limit}\n    proxy = proxy_url()\n    for attempt in range(4):\n        try:\n            r = await client.get(url, params=params, proxy=proxy, timeout=10)\n            used = r.headers.get(&quot;X-MBX-USED-WEIGHT-1M&quot;, &quot;?&quot;)\n            logging.info(&quot;depth %s weight=%s status=%s&quot;, symbol, used, r.status_code)\n            if r.status_code == 429:\n                await asyncio.sleep(int(r.headers.get(&quot;Retry-After&quot;, 5)))\n                continue\n            r.raise_for_status()\n            return r.json()\n        except httpx.HTTPError as e:\n            await asyncio.sleep(2 ** attempt)\n    return None\n\nasync def main():\n    throttle = WeightThrottle(WEIGHT_BUDGET_PER_MIN)\n    sem = asyncio.Semaphore(MAX_CONCURRENCY)\n    async with httpx.AsyncClient() as client:\n        symbols = [&quot;BTCUSDT&quot;, &quot;ETHUSDT&quot;, &quot;BNBUSDT&quot;, &quot;SOLUSDT&quot;, &quot;XRPUSDT&quot;]\n        async def worker(sym):\n            async with sem:\n                return await fetch_depth(client, sym, throttle)\n        results = await asyncio.gather(*[worker(s) for s in symbols])\n        for sym, res in zip(symbols, results):\n            print(f&quot;{sym}: bids={len(res[&apos;bids&apos;]) if res else 0}&quot;)\n\nif __name__ == &quot;__main__&quot;:\n    asyncio.run(main())\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>Esempio 3: Sessione sticky per backfill paginato di klines\u003C\u002Fh2>\u003Cp>Per ricostruire serie storiche lunghe, serve paginare con \u003Ccode>endTime\u003C\u002Fcode> e mantenere lo stesso IP (sticky) per evitare salti di peso tra IP diversi. Il flag \u003Ccode>-sid-abc123\u003C\u002Fcode> garantisce lo stesso IP per la durata della sessione.\u003C\u002Fp>\u003Cpre>\u003Ccode>import requests\nimport time\n\nPROXYHAT_USER = &quot;user&quot;\nPROXYHAT_PASS = &quot;pass&quot;\nGATE = &quot;gate.proxyhat.com:8080&quot;\nBASE = &quot;https:\u002F\u002Fapi.binance.com&quot;\n\n# Sessione sticky: stesso IP per tutto il backfill\nSTICKY_SESSION = &quot;klines-btc-backfill-001&quot;\nPROXY = {\n    &quot;http&quot;: f&quot;http:\u002F\u002F{PROXYHAT_USER}-country-DE-sid-{STICKY_SESSION}:{PROXYHAT_PASS}@{GATE}&quot;,\n    &quot;https&quot;: f&quot;http:\u002F\u002F{PROXYHAT_USER}-country-DE-sid-{STICKY_SESSION}:{PROXYHAT_PASS}@{GATE}&quot;,\n}\n\ndef backfill_klines(symbol=&quot;BTCUSDT&quot;, interval=&quot;1m&quot;, start_ms=None, end_ms=None, max_candles=100_000):\n    url = f&quot;{BASE}\u002Fapi\u002Fv3\u002Fklines&quot;\n    collected = []\n    cursor = start_ms\n    total = 0\n    while total &lt; max_candles:\n        params = {&quot;symbol&quot;: symbol, &quot;interval&quot;: interval, &quot;startTime&quot;: cursor, &quot;limit&quot;: 1000}\n        if end_ms:\n            params[&quot;endTime&quot;] = end_ms\n        r = requests.get(url, params=params, proxies=PROXY, timeout=10)\n        if r.status_code == 429:\n            time.sleep(int(r.headers.get(&quot;Retry-After&quot;, 5)))\n            continue\n        if r.status_code == 418:\n            print(&quot;Ban ricevuto, attesa 120s&quot;)\n            time.sleep(120)\n            continue\n        r.raise_for_status()\n        batch = r.json()\n        if not batch:\n            break\n        collected.extend(batch)\n        total += len(batch)\n        cursor = batch[-1][6] + 1  # close time + 1ms\n        print(f&quot;raccolte {len(batch)} candele, totale {total}, peso {r.headers.get(&apos;X-MBX-USED-WEIGHT-1M&apos;)}&quot;)\n        time.sleep(0.2)  # rispetto peso: klines limit=1000 → peso ~2\n    return collected\n\nif __name__ == &quot;__main__&quot;:\n    start = int(time.time() * 1000) - 3600_000  # ultima ora\n    data = backfill_klines(start_ms=start)\n    print(f&quot;totale candele: {len(data)}&quot;)\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>Esempio 4: Node.js con axios e proxy HTTPS\u003C\u002Fh2>\u003Cp>In Node.js, \u003Ccode>axios\u003C\u002Fcode> con \u003Ccode>https-proxy-agent\u003C\u002Fcode> è il pattern standard. Qui mostriamo rotazione per-request e gestione di 429\u002F418 con backoff.\u003C\u002Fp>\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst { HttpsProxyAgent } = require(&apos;https-proxy-agent&apos;);\n\nconst PROXYHAT_USER = &apos;user&apos;;\nconst PROXYHAT_PASS = &apos;pass&apos;;\nconst GATE = &apos;gate.proxyhat.com:8080&apos;;\nconst BASE = &apos;https:\u002F\u002Fapi.binance.com&apos;;\n\nfunction buildAgent(country = &apos;DE&apos;) {\n  const sess = `sess-${Math.floor(Math.random() * 10_000_000)}`;\n  const user = `${PROXYHAT_USER}-country-${country}-sid-${sess}`;\n  const proxyUrl = `http:\u002F\u002F${user}:${PROXYHAT_PASS}@${GATE}`;\n  return new HttpsProxyAgent(proxyUrl);\n}\n\nasync function fetchTicker24hr(symbol) {\n  const url = `${BASE}\u002Fapi\u002Fv3\u002Fticker\u002F24hr`;\n  const params = { symbol };\n  for (let attempt = 0; attempt &lt; 5; attempt++) {\n    try {\n      const agent = buildAgent(&apos;DE&apos;);\n      const res = await axios.get(url, { params, httpsAgent: agent, timeout: 10000 });\n      const used = res.headers[&apos;x-mbx-used-weight-1m&apos;];\n      console.log(`${symbol} weight=${used} status=${res.status}`);\n      return res.data;\n    } catch (err) {\n      if (err.response) {\n        const { status, headers } = err.response;\n        if (status === 429) {\n          const ra = parseInt(headers[&apos;retry-after&apos;] || &apos;5&apos;, 10);\n          console.warn(`429, sleeping ${ra}s`);\n          await new Promise(r =&gt; setTimeout(r, ra * 1000));\n          continue;\n        }\n        if (status === 418) {\n          console.error(&apos;418 ban, sleeping 120s&apos;);\n          await new Promise(r =&gt; setTimeout(r, 120_000));\n          continue;\n        }\n      }\n      const backoff = Math.pow(2, attempt) * 1000;\n      console.warn(`errore ${err.message}, retry in ${backoff}ms`);\n      await new Promise(r =&gt; setTimeout(r, backoff));\n    }\n  }\n  return null;\n}\n\n(async () =&gt; {\n  const data = await fetchTicker24hr(&apos;BTCUSDT&apos;);\n  if (data) console.log(`prezzo: ${data.lastPrice}, var 24h: ${data.priceChangePercent}%`);\n})();\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>Esempio 5: curl one-liner con proxy geolocalizzato\u003C\u002Fh2>\u003Cp>Per test rapidi o integrazione in pipeline shell, ecco un comando \u003Ccode>curl\u003C\u002Fcode> che usa il proxy HTTP ProxyHat con uscita dagli Stati Uniti (utile per verificare la geo-restrizione HTTP 451 o per accedere a Binance.com da IP US).\u003C\u002Fp>\u003Cpre>\u003Ccode># Test ticker\u002Fprice con proxy US\ncurl -x http:\u002F\u002Fuser-country-US-sid-test01:pass@gate.proxyhat.com:8080 \\\n  -s -w &quot;\\nHTTP %{http_code} weight=%header{x-mbx-used-weight-1m}\\n&quot; \\\n  &quot;https:\u002F\u002Fapi.binance.com\u002Fapi\u002Fv3\u002Fticker\u002Fprice?symbol=BTCUSDT&quot;\n\n# Backfill klines sticky session DE\ncurl -x http:\u002F\u002Fuser-country-DE-sid-backfill01:pass@gate.proxyhat.com:8080 \\\n  -s &quot;https:\u002F\u002Fapi.binance.com\u002Fapi\u002Fv3\u002Fklines?symbol=ETHUSDT&amp;interval=1h&amp;limit=100&quot; \\\n  | python -m json.tool | head -20\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>Quando preferire WebSocket invece del polling REST\u003C\u002Fh2>\u003Cp>Binance offre stream WebSocket pubblici su \u003Ccode>wss:\u002F\u002Fstream.binance.com:9443\u003C\u002Fcode> per kline, depth (diff e partial book), trade e ticker. Per dati in tempo reale continuo, i WebSocket sono quasi sempre superiori al polling REST:\u003C\u002Fp>\u003Cul>\u003Cli>Nessun peso REST: i consumano peso API; il rate limit REST non si applica.\u003C\u002Fli>\u003Cli>Latenza minima: push di aggiornamenti in tempo reale invece di polling a intervallo fisso.\u003C\u002Fli>\u003Cli>Banda ottimizzata: stream diff depth invia solo le modifiche, non l'intero snapshot.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Il polling REST resta preferibile per snapshot puntuali, backfill storici (klines paginati), o quando serve un singolo punto nel tempo. Una pipeline ibrida (REST per backfill + WebSocket per live) è il pattern più efficiente per dataset quant. Per approfondire, consulta la \u003Ca href=\"https:\u002F\u002Fdevelopers.binance.com\u002Fdocs\u002Fbinance-spot-api-docs\u002Fwebsockets\" rel=\"noopener noreferrer\">documentazione WebSocket di Binance\u003C\u002Fa>.\u003C\u002Fp>\u003Ch2>Errori comuni e edge case\u003C\u002Fh2>\u003Cul>\u003Cli>Ignorare X-MBX-USED-WEIGHT-1M: è l'unica fonte di verità sul consumo. Senza monitorarlo, vai alla cieca verso un ban.\u003C\u002Fli>\u003Cli>Usare proxy datacenter per Binance: IP datacenter sono spesso già flaggati o rate-limited più aggressivamente. I proxy residenziali hanno fingerprint più naturale e tasso di successo più alto.\u003C\u002Fli>\u003Cli>Rotazione troppo aggressiva senza sticky per paginazione: se cambi IP a metà backfill, i pesi si distribuiscono ma potresti perdere coerenza temporale o ricevere 451 su un IP US mid-stream.\u003C\u002Fli>\u003Cli>\u003Cstrong>Non gestire HTTP 451:\u003C\u002Fstrong> se l'IP è in US e l'endpoint è Binance.com, ricevi 451. Usa \u003Ccode>-country-DE\u003C\u002Fcode> o un Paese supportato, oppure passa a \u003Ccode>api.binance.us\u003C\u002Fcode> con endpoint equivalenti.\u003C\u002Fli>\u003Cli>Concorrenza illimitata: anche con molti IP, la CPU locale e la banda diventano colli di bottiglia. Limita a 10–50 connessioni simultanee.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Configurazione ProxyHat e risorse\u003C\u002Fh2>\u003Cp>Per iniziare con ProxyHat, configura le credenziali nel \u003Ca href=\"\u002Fit\u002Flocations\">pannello delle location\u003C\u002Fa> e consulta la \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentazione ufficiale ProxyHat\u003C\u002Fa> per dettagli su rotazione, sessioni sticky e geolocalizzazione. Per i prezzi dei piani residenziali, vedi la \u003Ca href=\"\u002Fit\u002Fpricing\">pagina pricing\u003C\u002Fa>. Se stai costruendo pipeline di \u003Ca href=\"\u002Fit\u002Fuse-cases\u002Fweb-scraping\">web scraping\u003C\u002Fa> o \u003Ca href=\"\u002Fit\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa>, gli stessi pattern di rotazione si applicano.\u003C\u002Fp>\u003Ch2>Punti chiave (Key Takeaways)\u003C\u002Fh2>\u003Cblockquote>\u003Cul>\u003Cli>Binance usa rate limit basato su peso per IP (~6.000\u002Fmin); monitora sempre \u003Ccode>X-MBX-USED-WEIGHT-1M\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>\u003Ccode>\u002Fapi\u002Fv3\u002Fdepth\u003C\u002Fcode> con limit alto è il consumer più vorace: peso 20–50 per richiesta.\u003C\u002Fli>\u003Cli>HTTP 429 = rallenta (leggi \u003Ccode>Retry-After\u003C\u002Fcode>); HTTP 418 = ban (minuti\u002Fgiorni).\u003C\u002Fli>\u003Cli>Proxy residenziali rotanti distribuiscono il peso su molti IP; geolocalizzazione \u003Ccode>-country-US\u003C\u002Fcode> risolve HTTP 451.\u003C\u002Fli>\u003Cli>Usa sessioni sticky (\u003Ccode>-sid-abc123\u003C\u002Fcode>) per backfill paginati di klines.\u003C\u002Fli>\u003Cli>Per dati live continui, preferisci WebSocket; per snapshot e storici, REST con proxy.\u003C\u002Fli>\u003Cli>Usa solo dati di mercato pubblici e rispetta i ToS di Binance.\u003C\u002Fli>\u003C\u002Ful>\u003C\u002Fblockquote>","Scraping Binance REST API con proxy | ProxyHat","Guida pratica per fare scraping della Binance REST API con proxy: endpoint, pesi, rate limit, esempi Python\u002FNode.js e proxy residenziali ProxyHat.","\u002Fit\u002Fblog\u002Fscraping-binance-rest-api-con-proxy",null,"https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscraping-binance-rest-api-con-proxy-og.webp",[17,20,23,26],{"question":18,"answer":19},"Come fare scraping della Binance REST API con proxy?","Significa raccogliere dati di mercato pubblici (klines, depth, ticker, prezzo) dagli endpoint REST di Binance instradando le richieste attraverso proxy rotanti per distribuire il peso del rate limit su più IP ed evitare ban. Si implementa configurando il client HTTP per usare il gateway ProxyHat (gate.proxyhat.com:8080) con flag di rotazione e geolocalizzazione nel username, monitorando l'header X-MBX-USED-WEIGHT-1M e gestendo 429\u002F418 con backoff.",{"question":21,"answer":22},"Perché usare proxy per la Binance REST API è importante?","Binance applica un limite di peso per IP (~6.000\u002Fmin). Un polling aggressivo di \u002Fapi\u002Fv3\u002Fdepth o chiamate multi-simbolo possono esaurire il budget in pochi minuti, causando HTTP 429 e poi ban HTTP 418 che durano da 2 minuti a 3 giorni. I proxy residenziali rotanti distribuiscono il peso su molti IP, mantenendo throughput elevato senza interruzioni, e permettono di superare la geo-restrizione HTTP 451 scegliendo il Paese di uscita.",{"question":24,"answer":25},"Quale tipo di proxy funziona meglio per Binance?","I proxy residenziali sono i migliori per Binance perché hanno fingerprint IP naturale (ISP reali), tasso di successo più alto e meno probabilità di essere pre-flaggati rispetto ai datacenter. ProxyHat offre residenziali rotanti con geolocalizzazione per paese e città. Per backfill paginati, usa sessioni sticky; per polling distribuito, ruota per-request. SOCKS5 (porta 1080) è utile per client che lo preferiscono, ma HTTP (porta 8080) è sufficiente per la maggior parte dei casi.",{"question":27,"answer":28},"Come evitare i ban quando si fa scraping della Binance REST API?","Rispetta il peso: leggi sempre X-MBX-USED-WEIGHT-1M e mantieniti sotto ~5.500\u002Fmin per margine. Implementa backoff esponenziale su 429 e rispetta Retry-After. Su 418, fermati per almeno 120 secondi. Distribuisci il peso su più IP residenziali rotanti. Limita la concorrenza (10–50 connessioni). Per dati live, preferisci WebSocket. Non forzare mai oltre il limite: un ban di 3 giorni può invalidare giorni di raccolta dati.",false,"2026-08-03T10:04:04+00:00","2026-10-03T08:29:51+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscraping-binance-rest-api-con-proxy-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscraping-binance-rest-api-con-proxy-card.webp",12,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[41],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},4,"developer-guides","Guide per sviluppatori","Guida agli sviluppatori | ProxyHat Blog","Istruzioni di codice e guide SDK per integrare i proxy nelle applicazioni.",[],{"fr":49,"pt":50,"ko":51,"ru":52,"en":53,"zh":54,"x-default":53},"\u002Ffr\u002Fblog\u002Fcomment-scraper-api-rest-binance-proxies","\u002Fpt\u002Fblog\u002Fcomo-raspar-api-binance-proxies","\u002Fko\u002Fblog\u002Fbinance-rest-api-proxy-scraping","\u002Fru\u002Fblog\u002Fkak-skrejpit-binance-rest-api-proksi","\u002Fblog\u002Fscrape-binance-rest-api-proxies","\u002Fcn\u002Fblog\u002Fbinance-rest-api-proxy-scraping-guide",{"tr":56,"fr":49,"ja":57,"pt":50,"ko":51,"pl":58,"es":59,"ru":52,"en":53,"zh":54,"it":13,"de":60},"\u002Ftr\u002Fblog\u002Fbinance-rest-api-proxy-tarama","\u002Fja\u002Fblog\u002Fbinance-api-scraping-proxy","\u002Fpl\u002Fblog\u002Fjak-scrapowac-rest-api-binance-proxy","\u002Fes\u002Fblog\u002Fscrapear-api-binance-proxies","\u002Fde\u002Fblog\u002Fbinance-rest-api-mit-proxies-scrapen",81,[63,79,95,111],{"id":64,"slug":65,"title":66,"excerpt":67,"featured_image_url":68,"featured_image_alt":69,"card_image_url":70,"og_image_url":71,"published_at":72,"updated_at":72,"content_updated_at":73,"reading_time_minutes":35,"is_featured":29,"indexable":4,"views":74,"author":75,"categories":76,"tags":78},176,"guida-got-scraping-nodejs-proxy","Guida a got-scraping in Node.js: proxy residenziali e header generator","Una guida pratica per sviluppatori Node.js su got-scraping, il client HTTP di Apify basato su got, con header generator coerenti, proxy residenziali su gate.proxyhat.com:8080 e pattern di produzione per scraping a scala.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fguida-got-scraping-nodejs-proxy-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fguida-got-scraping-nodejs-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fguida-got-scraping-nodejs-proxy-og.webp","2026-08-04T16:05:06+00:00","2026-10-03T08:29:58+00:00",121,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[77],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],{"id":80,"slug":81,"title":82,"excerpt":83,"featured_image_url":84,"featured_image_alt":85,"card_image_url":86,"og_image_url":87,"published_at":88,"updated_at":88,"content_updated_at":89,"reading_time_minutes":35,"is_featured":29,"indexable":29,"views":90,"author":91,"categories":92,"tags":94},175,"proxy-rotanti-in-colly-guida","Proxy Rotanti in Colly: Guida Pratica per Go Developer","Scopri come integrare proxy rotanti in Colly con un approccio idiomatico: RoundRobinProxySwitcher, sessioni sticky, geo-targeting e pattern di produzione per scraping ad alto throughput in Go.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fproxy-rotanti-in-colly-guida-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fproxy-rotanti-in-colly-guida-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fproxy-rotanti-in-colly-guida-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T08:29:56+00:00",71,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[93],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],{"id":96,"slug":97,"title":98,"excerpt":99,"featured_image_url":100,"featured_image_alt":101,"card_image_url":102,"og_image_url":103,"published_at":104,"updated_at":104,"content_updated_at":105,"reading_time_minutes":35,"is_featured":29,"indexable":4,"views":106,"author":107,"categories":108,"tags":110},195,"scrape-bybit-v5-market-api-proxy","Raccogliere Dati di Mercato Crypto con Proxy Rotanti: Guida per Sviluppatori (Esempio Bybit V5)","Guida pratica per sviluppatori su come scrapeare gli endpoint pubblici \u002Fv5\u002Fmarket\u002F di Bybit con proxy rotanti ProxyHat. Esempi in Node.js e Python, gestione dei rate limit e geo-restrizioni.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscrape-bybit-v5-market-api-proxy-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscrape-bybit-v5-market-api-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscrape-bybit-v5-market-api-proxy-og.webp","2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00",87,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[109],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],{"id":112,"slug":113,"title":114,"excerpt":115,"featured_image_url":116,"featured_image_alt":117,"card_image_url":118,"og_image_url":119,"published_at":120,"updated_at":120,"content_updated_at":121,"reading_time_minutes":35,"is_featured":29,"indexable":29,"views":122,"author":123,"categories":124,"tags":126},172,"usare-proxy-in-swift-urlsession-1","Usare proxy in Swift con URLSession: guida pratica per iOS e macOS","Una guida code-first per configurare proxy residenziali in Swift tramite URLSession, con esempi su HTTP\u002FSOCKS5, autenticazione, geo-targeting, async\u002Fawait e best practice di produzione.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fusare-proxy-in-swift-urlsession-1-master.webp","Using Proxies in Swift: A Code-First Guide to URLSession, SOCKS5 & Residential IPs","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fusare-proxy-in-swift-urlsession-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fusare-proxy-in-swift-urlsession-1-og.webp","2026-07-26T16:03:44+00:00","2026-10-03T23:53:00+00:00",230,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[125],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],[]]