[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-pt-como-raspar-api-binance-proxies":3},{"success":4,"payload":5,"related":63,"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":15,"og_description":12,"og_image_url":16,"faq_json":17,"key_takeaways":14,"allow_index":4,"noindex_google_only":30,"allow_follow":4,"published_at":31,"updated_at":31,"content_updated_at":32,"featured_image_url":33,"featured_image_alt":34,"card_image_url":35,"reading_time_minutes":36,"author":37,"categories":41,"tags":48,"alternates":49,"locale_paths":55,"views":62},194,"como-raspar-api-binance-proxies","Limites de peso em APIs de exchanges cripto: como coletar dados de mercado com proxies (exemplo Binance)","Guia prático para coletar dados públicos de mercado da Binance REST API em escala usando proxies residenciais rotativos, com exemplos em Python e Node.js, controle de peso e mitigação de banimentos por IP.","\u003Cp>Se você está construindo pipelines de dados quant ou alimentando modelos de trading com candles e order books da Binance, já esbarrou no limite de peso por IP. Este guia mostra como raspar a API REST da Binance com proxies de forma eficiente, cobrindo endpoints públicos, rate limiting baseado em peso, rotação de IPs e padrões de produção com retries e backoff exponencial.\u003C\u002Fp>\n\n\u003Cdiv class=\"callout\">\n\u003Cp>\u003Cstrong>Aviso de conformidade:\u003C\u002Fstrong> Este artigo cobre apenas \u003Cem>dados públicos de mercado\u003C\u002Fem> via endpoints REST abertos. Respeite os limites de peso documentados, leia os \u003Ca href=\"https:\u002F\u002Fwww.binance.com\u002Fen\u002Fterms\" rel=\"noopener noreferrer\">Termos de Uso da Binance\u003C\u002Fa> e prefira acesso oficial via API quando os termos exigirem. Não incentivamos coleta de dados privados, evasão de restrições regulatórias nem violação de ToS.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\u003Ch2>Por que raspar a API REST da Binance com proxies é necessário\u003C\u002Fh2>\n\n\u003Cp>A Binance opera uma das maiores APIs públicas de cripto do mundo. Os endpoints REST em \u003Ccode>api.binance.com\u003C\u002Fcode> são gratuitos, não exigem autenticação para dados de mercado e retornam JSON estruturado. O problema é que a Binance usa um sistema de limite de taxa baseado em peso por IP, não por conta. Cada endpoint consome uma quantidade diferente de \"peso\" e o orçamento por IP é de aproximadamente 6.000 pesos por minuto.\u003C\u002Fp>\n\n\u003Cp>Quando você consome esse orçamento, recebe um HTTP 429 Too Many Requests. Se persistir, a Binance escala para um HTTP 418 (IP banido) com um cabeçalho \u003Ccode>Retry-After\u003C\u002Fcode> indicando quanto tempo esperar — tipicamente entre 2 minutos e 3 dias, conforme a severidade. É por isso que desenvolvedores precisam de proxies: distribuir o peso across múltiplos IPs é a única forma de escalar a coleta sem ser banido.\u003C\u002Fp>\n\n\u003Cp>Segundo a \u003Ca href=\"https:\u002F\u002Fdevelopers.binance.com\u002Fdocs\u002Fbinance-spot-api-docs\u002Frest-api\" rel=\"noopener noreferrer\">documentação oficial da Binance Spot API\u003C\u002Fa>, cada resposta inclui o cabeçalho \u003Ccode>X-MBX-USED-WEIGHT-1M\u003C\u002Fcode>, que indica quantos pesos você consumiu no último minuto. Monitorar esse valor é essencial para throttling dinâmico.\u003C\u002Fp>\n\n\u003Ch3>Endpoints-chave de dados públicos de mercado\u003C\u002Fh3>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Endpoint\u003C\u002Fth>\u003Cth>Descrição\u003C\u002Fth>\u003Cth>Peso (aprox.)\u003C\u002Fth>\u003Cth>Uso típico\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Ccode>GET \u002Fapi\u002Fv3\u002Fklines\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Candlesticks OHLCV\u003C\u002Ftd>\u003Ctd>1–2\u003C\u002Ftd>\u003Ctd>Backfill histórico, gráficos\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>GET \u002Fapi\u002Fv3\u002Fdepth\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Order book snapshot\u003C\u002Ftd>\u003Ctd>5–20 (depende do limit)\u003C\u002Ftd>\u003Ctd>Microestrutura de mercado\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>GET \u002Fapi\u002Fv3\u002Fticker\u002F24hr\u003C\u002Ftd>\u003Ctd>Estatísticas 24h\u003C\u002Ftd>\u003Ctd>1–40 (por symbol ou all)\u003C\u002Ftd>\u003Ctd>Dashboards, screening\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>GET \u002Fapi\u002Fv3\u002Fticker\u002Fprice\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Preço atual\u003C\u002Ftd>\u003Ctd>1–2\u003C\u002Ftd>\u003Ctd>Monitoramento em tempo real\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>O endpoint \u003Ccode>\u002Fapi\u002Fv3\u002Fdepth\u003C\u002Fcode> é o mais custoso: com \u003Ccode>limit=1000\u003C\u002Fcode>, consome 20 pesos por requisição. Em polling contínuo a cada 500ms, você queima 2.400 pesos por minuto — quase metade do orçamento em um único IP. Com \u003Ccode>limit=5000\u003C\u002Fcode>, são 50 pesos por chamada, esgotando o orçamento em ~2,4 minutos.\u003C\u002Fp>\n\n\u003Ch2>Arquitetura de coleta com proxies residenciais rotativos\u003C\u002Fh2>\n\n\u003Cp>A estratégia é simples: cada IP recebe seu próprio orçamento de 6.000 pesos\u002Fmin. Com N \u003Ca href=\"\u002Fpt\u002Fproxy\u002Fresidential\">IPs residenciais\u003C\u002Fa> rotativos, seu orçamento efetivo é \u003Ccode>N × 6.000\u003C\u002Fcode>. Com 50 IPs, são 300.000 pesos por minuto — suficiente para polling agressivo de depth em múltiplos pares.\u003C\u002Fp>\n\n\u003Cp>Proxies residenciais são preferidos sobre datacenter porque a Binance frequentemente penaliza ranges de IPs de datacenter conhecidos. IPs residenciais aparecem como tráfego de usuários finais legítimos, reduzindo a probabilidade de 429 e 418.\u003C\u002Fp>\n\n\u003Ch3>Bypass do geo-split Binance.com vs Binance.US\u003C\u002Fh3>\n\n\u003Cp>Usuários nos EUA frequentemente recebem HTTP 451 Unavailable For Legal Reasons ao acessar \u003Ccode>api.binance.com\u003C\u002Fcode>, devido ao bloqueio geográfico. Com geo-targeting no username do ProxyHat (\u003Ccode>-country-US\u003C\u002Fcode>), você pode rotear através de IPs de outros países para acessar endpoints globais, ou usar IPs dos EUA para acessar \u003Ccode>api.binance.us\u003C\u002Fcode> quando apropriado.\u003C\u002Fp>\n\n\u003Ch2>Configuração do ProxyHat: HTTP e SOCKS5\u003C\u002Fh2>\n\n\u003Cp>O ProxyHat oferece gateway único em \u003Ccode>gate.proxyhat.com\u003C\u002Fcode> com porta 8080 para HTTP e 1080 para SOCKS5. A rotação e geo-targeting são controlados via flags no username.\u003C\u002Fp>\n\n\u003Ch3>Formatos de URL\u003C\u002Fh3>\n\n\u003Cpre>\u003Ccode># HTTP — rotação automática por requisição\nhttp:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:8080\n\n# HTTP — geo-targeting EUA\nhttp:\u002F\u002FUSERNAME-country-US:PASSWORD@gate.proxyhat.com:8080\n\n# HTTP — sessão fixa (sticky) para paginação\nhttp:\u002F\u002FUSERNAME-sid-abc123:PASSWORD@gate.proxyhat.com:8080\n\n# SOCKS5 — para clientes que exigem SOCKS\nsocks5:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:1080\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Exemplo 1: curl com proxy bruto e monitoramento de peso\u003C\u002Fh2>\n\n\u003Cpre>\u003Ccode># Consultar klines com proxy rotativo e capturar peso usado\ncurl -x http:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:8080 \\\n  -s -D - \\\n  &apos;https:\u002F\u002Fapi.binance.com\u002Fapi\u002Fv3\u002Fklines?symbol=BTCUSDT&amp;interval=1m&amp;limit=100&apos; \\\n  -o \u002Fdev\u002Fnull | grep -i &apos;x-mbx-used-weight&apos;\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>O cabeçalho \u003Ccode>X-MBX-USED-WEIGHT-1M\u003C\u002Fcode> na resposta diz exatamente quantos pesos aquele IP consumiu. Em rotação por requisição, cada IP começa com peso próximo de zero.\u003C\u002Fp>\n\n\u003Ch2>Exemplo 2: Python requests com rotação por requisição via ProxyHat SDK\u003C\u002Fh2>\n\n\u003Cpre>\u003Ccode>import requests\nimport time\nimport random\nimport logging\n\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nPROXYHAT_USER = &apos;seu_usuario&apos;\nPROXYHAT_PASS = &apos;sua_senha&apos;\n\n# Cada request_id único força novo IP\n\ndef get_proxy_url(request_id: str, country: str = None) -&gt; str:\n    username = f&apos;{PROXYHAT_USER}-sid-{request_id}&apos;\n    if country:\n        username += f&apos;-country-{country}&apos;\n    return f&apos;http:\u002F\u002F{username}:{PROXYHAT_PASS}@gate.proxyhat.com:8080&apos;\n\n\ndef fetch_klines(symbol: str, interval: str, limit: int, max_retries: int = 5) -&gt; list:\n    url = f&apos;https:\u002F\u002Fapi.binance.com\u002Fapi\u002Fv3\u002Fklines&apos;\n    params = {&apos;symbol&apos;: symbol, &apos;interval&apos;: interval, &apos;limit&apos;: limit}\n\n    for attempt in range(max_retries):\n        request_id = f&apos;klines-{int(time.time())}-{random.randint(1000,9999)}&apos;\n        proxies = {\n            &apos;http&apos;: get_proxy_url(request_id, country=&apos;DE&apos;),\n            &apos;https&apos;: get_proxy_url(request_id, country=&apos;DE&apos;),\n        }\n        try:\n            resp = requests.get(url, params=params, proxies=proxies, timeout=10)\n            used_weight = resp.headers.get(&apos;X-MBX-USED-WEIGHT-1M&apos;, &apos;?&apos;)\n            logger.info(f&apos;Peso usado no IP: {used_weight} | attempt={attempt}&apos;)\n\n            if resp.status_code == 200:\n                return resp.json()\n            elif resp.status_code == 429:\n                retry_after = int(resp.headers.get(&apos;Retry-After&apos;, 5))\n                logger.warning(f&apos;429 recebido. Esperando {retry_after}s&apos;)\n                time.sleep(retry_after)\n            elif resp.status_code == 418:\n                retry_after = int(resp.headers.get(&apos;Retry-After&apos;, 60))\n                logger.error(f&apos;418 banido neste IP. Esperando {retry_after}s&apos;)\n                time.sleep(retry_after)\n            else:\n                resp.raise_for_status()\n        except requests.RequestException as e:\n            backoff = (2 ** attempt) + random.uniform(0, 1)\n            logger.warning(f&apos;Erro: {e}. Backoff {backoff:.1f}s&apos;)\n            time.sleep(backoff)\n\n    raise RuntimeError(f&apos;Falha após {max_retries} tentativas&apos;)\n\n\n# Uso\ndata = fetch_klines(&apos;BTCUSDT&apos;, &apos;1m&apos;, 500)\nprint(f&apos;Candles recebidos: {len(data)}&apos;)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Neste exemplo, cada chamada gera um novo \u003Ccode>sid-ID\u003C\u002Fcode>, forçando o ProxyHat a atribuir um novo IP residencial. O monitoramento do cabeçalho \u003Ccode>X-MBX-USED-WEIGHT-1M\u003C\u002Fcode> permite throttling adaptativo.\u003C\u002Fp>\n\n\u003Ch2>Exemplo 3: Python httpx async com sessão fixa para backfill paginado de klines\u003C\u002Fh2>\n\n\u003Cpre>\u003Ccode>import httpx\nimport asyncio\nimport logging\nfrom datetime import datetime, timedelta\n\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nPROXYHAT_USER = &apos;seu_usuario&apos;\nPROXYHAT_PASS = &apos;sua_senha&apos;\n\n# Sessão fixa mantém o MESMO IP durante todo o backfill\n# Isso é crítico: se o IP mudar no meio da paginação,\n# o peso acumulado é perdido e você recomeça do zero.\n\nSESSION_ID = &apos;backfill-btcusdt-001&apos;\nBASE_PROXY = (\n    f&apos;http:\u002F\u002F{PROXYHAT_USER}-sid-{SESSION_ID}:&apos;\n    f&apos;{PROXYHAT_PASS}@gate.proxyhat.com:8080&apos;\n)\n\n\nclass WeightAwareThrottler:\n    def __init__(self, max_weight: int = 5000):\n        self.max_weight = max_weight\n        self.current_weight = 0\n\n    def check(self, used_weight_header: str):\n        if used_weight_header:\n            self.current_weight = int(used_weight_header)\n        if self.current_weight &gt;= self.max_weight:\n            sleep_time = 62  # reseta a cada ~60s\n            logger.info(f&apos;Peso {self.current_weight} &gt;= limite. Dormindo {sleep_time}s&apos;)\n            asyncio.get_event_loop().run_until_complete(\n                asyncio.sleep(sleep_time)\n            )\n\n\nasync def fetch_klines_page(client, symbol, interval, start_time, end_time):\n    params = {\n        &apos;symbol&apos;: symbol,\n        &apos;interval&apos;: interval,\n        &apos;startTime&apos;: start_time,\n        &apos;endTime&apos;: end_time,\n        &apos;limit&apos;: 1000,\n    }\n    resp = await client.get(\n        &apos;https:\u002F\u002Fapi.binance.com\u002Fapi\u002Fv3\u002Fklines&apos;,\n        params=params\n    )\n    used = resp.headers.get(&apos;x-mbx-used-weight-1m&apos;, &apos;0&apos;)\n    logger.info(f&apos;Peso usado: {used}&apos;)\n    if resp.status_code == 429:\n        retry_after = int(resp.headers.get(&apos;retry-after&apos;, 5))\n        await asyncio.sleep(retry_after)\n        return await fetch_klines_page(client, symbol, interval, start_time, end_time)\n    resp.raise_for_status()\n    return resp.json()\n\n\nasync def backfill_klines(symbol: str, interval: str, days: int = 7):\n    throttler = WeightAwareThrottler(max_weight=5000)\n    start = int((datetime.utcnow() - timedelta(days=days)).timestamp() * 1000)\n    end = int(datetime.utcnow().timestamp() * 1000)\n\n    all_candles = []\n    async with httpx.AsyncClient(\n        proxy=BASE_PROXY,\n        timeout=15.0,\n        limits=httpx.Limits(max_connections=5, max_keepalive_connections=2),\n    ) as client:\n        current = start\n        while current &lt; end:\n            page_end = min(current + (1000 * 60_000), end)  # 1000 candles de 1m\n            candles = await fetch_klines_page(client, symbol, interval, current, page_end)\n            if not candles:\n                break\n            all_candles.extend(candles)\n            current = candles[-1][0] + 1  # next open time + 1ms\n            throttler.check(client.headers.get(&apos;x-mbx-used-weight-1m&apos;, &apos;0&apos;))\n            await asyncio.sleep(0.25)  # 250ms entre chamadas\n\n    logger.info(f&apos;Total candles coletados: {len(all_candles)}&apos;)\n    return all_candles\n\n\n# Executar\nasyncio.run(backfill_klines(&apos;BTCUSDT&apos;, &apos;1m&apos;, days=3))\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Aqui usamos uma sessão fixa (\u003Ccode>-sid-backfill-btcusdt-001\u003C\u002Fcode>) para manter o mesmo IP durante toda a paginação. Isso preserva o contexto de peso acumulado e evita resets desnecessários. O \u003Ccode>WeightAwareThrottler\u003C\u002Fcode> monitora o peso e pausa antes de atingir o limite de 6.000.\u003C\u002Fp>\n\n\u003Ch2>Exemplo 4: Node.js com axios e rotação de IPs\u003C\u002Fh2>\n\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst { HttpsProxyAgent } = require(&apos;https-proxy-agent&apos;);\n\nconst PROXYHAT_USER = &apos;seu_usuario&apos;;\nconst PROXYHAT_PASS = &apos;sua_senha&apos;;\n\nfunction buildProxy(requestId, country = null) {\n  let username = `${PROXYHAT_USER}-sid-${requestId}`;\n  if (country) username += `-country-${country}`;\n  return `http:\u002F\u002F${username}:${PROXYHAT_PASS}@gate.proxyhat.com:8080`;\n}\n\nasync function fetchDepth(symbol, limit = 100, maxRetries = 5) {\n  const url = &apos;https:\u002F\u002Fapi.binance.com\u002Fapi\u002Fv3\u002Fdepth&apos;;\n\n  for (let attempt = 0; attempt &lt; maxRetries; attempt++) {\n    const requestId = `depth-${Date.now()}-${Math.floor(Math.random() * 10000)}`;\n    const proxyUrl = buildProxy(requestId, &apos;JP&apos;);\n    const agent = new HttpsProxyAgent(proxyUrl);\n\n    try {\n      const resp = await axios.get(url, {\n        params: { symbol, limit },\n        httpsAgent: agent,\n        timeout: 10000,\n        headers: { &apos;User-Agent&apos;: &apos;Mozilla\u002F5.0&apos; },\n      });\n\n      const usedWeight = resp.headers[&apos;x-mbx-used-weight-1m&apos;];\n      console.log(`Peso: ${usedWeight} | IP rotacionado: ${requestId}`);\n\n      return resp.data;\n    } catch (err) {\n      if (err.response) {\n        const status = err.response.status;\n        const retryAfter = err.response.headers[&apos;retry-after&apos;] || 5;\n\n        if (status === 429) {\n          console.warn(`429: esperando ${retryAfter}s`);\n          await new Promise(r =&gt; setTimeout(r, retryAfter * 1000));\n        } else if (status === 418) {\n          console.error(`418 banido neste IP. Esperando ${retryAfter}s`);\n          await new Promise(r =&gt; setTimeout(r, retryAfter * 1000));\n        } else {\n          throw err;\n        }\n      } else {\n        const backoff = Math.pow(2, attempt) * 1000 + Math.random() * 1000;\n        console.warn(`Erro de rede: ${err.message}. Backoff ${backoff}ms`);\n        await new Promise(r =&gt; setTimeout(r, backoff));\n      }\n    }\n  }\n  throw new Error(`Falha após ${maxRetries} tentativas`);\n}\n\n\u002F\u002F Polling com concorrência limitada\nasync function pollDepth(symbols, intervalMs = 1000) {\n  const MAX_CONCURRENT = 5;\n  const queue = [...symbols];\n  const results = [];\n\n  async function worker() {\n    while (queue.length &gt; 0) {\n      const sym = queue.shift();\n      try {\n        const data = await fetchDepth(sym, 100);\n        results.push({ symbol: sym, data });\n      } catch (e) {\n        console.error(`Falha em ${sym}: ${e.message}`);\n      }\n      await new Promise(r =&gt; setTimeout(r, intervalMs));\n    }\n  }\n\n  await Promise.all(Array.from({ length: MAX_CONCURRENT }, () =&gt; worker()));\n  return results;\n}\n\n\u002F\u002F Uso\npollDepth([&apos;BTCUSDT&apos;, &apos;ETHUSDT&apos;, &apos;SOLUSDT&apos;], 800).then(() =&gt; {\n  console.log(&apos;Coleta concluída&apos;);\n});\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Exemplo 5: Throttling com peso adaptativo e circuit breaker\u003C\u002Fh2>\n\n\u003Cpre>\u003Ccode>import httpx\nimport asyncio\nimport logging\nimport random\n\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nPROXYHAT_USER = &apos;seu_usuario&apos;\nPROXYHAT_PASS = &apos;sua_senha&apos;\n\nclass BinanceScraper:\n    def __init__(self, max_concurrent=10, weight_threshold=5500):\n        self.max_concurrent = max_concurrent\n        self.weight_threshold = weight_threshold\n        self.circuit_open = False\n        self.consecutive_failures = 0\n        self.semaphore = asyncio.Semaphore(max_concurrent)\n\n    def _proxy_url(self, session_id, country=None):\n        user = f&apos;{PROXYHAT_USER}-sid-{session_id}&apos;\n        if country:\n            user += f&apos;-country-{country}&apos;\n        return f&apos;http:\u002F\u002F{user}:{PROXYHAT_PASS}@gate.proxyhat.com:8080&apos;\n\n    async def _request(self, endpoint, params, session_id, country=None):\n        async with self.semaphore:\n            if self.circuit_open:\n                logger.warning(&apos;Circuit breaker aberto. Aguardando 30s&apos;)\n                await asyncio.sleep(30)\n                self.circuit_open = False\n\n            proxy = self._proxy_url(session_id, country)\n            async with httpx.AsyncClient(proxy=proxy, timeout=10) as client:\n                resp = await client.get(\n                    f&apos;https:\u002F\u002Fapi.binance.com{endpoint}&apos;,\n                    params=params\n                )\n\n                used_weight = int(resp.headers.get(&apos;x-mbx-used-weight-1m&apos;, 0))\n\n                # Throttling adaptativo baseado no peso\n                if used_weight &gt; self.weight_threshold:\n                    sleep_time = max(60 - (used_weight \u002F\u002F 100), 5)\n                    logger.info(f&apos;Peso {used_weight} alto. Dormindo {sleep_time}s&apos;)\n                    await asyncio.sleep(sleep_time)\n\n                if resp.status_code == 200:\n                    self.consecutive_failures = 0\n                    return resp.json()\n                elif resp.status_code == 429:\n                    retry_after = int(resp.headers.get(&apos;retry-after&apos;, 10))\n                    await asyncio.sleep(retry_after)\n                    return await self._request(endpoint, params, session_id, country)\n                elif resp.status_code == 418:\n                    self.consecutive_failures += 1\n                    if self.consecutive_failures &gt;= 3:\n                        self.circuit_open = True\n                    retry_after = int(resp.headers.get(&apos;retry-after&apos;, 120))\n                    logger.error(f&apos;IP banido. Esperando {retry_after}s&apos;)\n                    await asyncio.sleep(retry_after)\n                    # Novo IP via nova session\n                    new_sid = f&apos;{session_id}-retry-{random.randint(100,999)}&apos;\n                    return await self._request(endpoint, params, new_sid, country)\n                else:\n                    resp.raise_for_status()\n\n    async def scrape_ticker_24hr(self, symbols):\n        tasks = []\n        for sym in symbols:\n            sid = f&apos;ticker24-{sym}-{random.randint(0,99999)}&apos;\n            tasks.append(\n                self._request(\n                    &apos;\u002Fapi\u002Fv3\u002Fticker\u002F24hr&apos;,\n                    {&apos;symbol&apos;: sym},\n                    sid,\n                    country=&apos;SG&apos;\n                )\n            )\n        return await asyncio.gather(*tasks, return_exceptions=True)\n\n\n# Uso\nasync def main():\n    scraper = BinanceScraper(max_concurrent=10, weight_threshold=5500)\n    symbols = [&apos;BTCUSDT&apos;, &apos;ETHUSDT&apos;, &apos;BNBUSDT&apos;, &apos;SOLUSDT&apos;, &apos;XRPUSDT&apos;]\n    results = await scraper.scrape_ticker_24hr(symbols)\n    for sym, result in zip(symbols, results):\n        if isinstance(result, Exception):\n            logger.error(f&apos;{sym}: {result}&apos;)\n        else:\n            logger.info(f&apos;{sym}: var {result.get(&quot;priceChangePercent&quot;, &quot;N\u002FA&quot;)}%&apos;)\n\nasyncio.run(main())\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Quando usar WebSocket streams em vez de REST polling\u003C\u002Fh2>\n\n\u003Cp>Para dados em tempo real, a Binance oferece WebSocket streams em \u003Ccode>wss:\u002F\u002Fstream.binance.com:9443\u003C\u002Fcode>. Para klines e depth contínuos, WebSocket é superior porque:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Não consome peso REST:\u003C\u002Fstrong> streams são rate-limited separadamente (máx 5 conexões por IP, 200 streams por conexão).\u003C\u002Fli>\n\u003Cli>Latência menor: pushes em vez de polling. Atualizações de depth chegam em ~10ms vs 500ms+ de polling.\u003C\u002Fli>\n\u003Cli>Menos overhead: uma conexão WebSocket substitui dezenas de polls REST por minuto.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Use REST para backfill histórico (klines paginadas), snapshots pontuais e endpoints sem equivalente WebSocket. Use WebSocket para monitoramento contínuo de preço, depth incremental e trade streams.\u003C\u002Fp>\n\n\u003Ch2>Erros comuns e armadilhas\u003C\u002Fh2>\n\n\u003Cul>\n\u003Cli>Ignorar o cabeçalho X-MBX-USED-WEIGHT-1M: sem monitorar o peso, você descobre o limite só quando recebe 429.\u003C\u002Fli>\n\u003Cli>Usar datacenter proxies para depth polling: ranges de datacenter são frequentemente penalizados. Prefira residenciais.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Não respeitar Retry-After:\u003C\u002Fstrong> receber 429 e continuar batendo garante um 418 com ban de horas ou dias.\u003C\u002Fli>\n\u003Cli>Mudar de IP no meio de paginação: se você está paginando klines com startTime\u002FendTime, trocar de IP reinicia o contador de peso mas pode causar gaps se a paginação depende de estado do servidor.\u003C\u002Fli>\n\u003Cli>Concorrência sem limite: abrir 50 conexões simultâneas sem semáforo esgota o orçamento em segundos. Use \u003Ccode>asyncio.Semaphore\u003C\u002Fcode> ou equivalente.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Não tratar HTTP 451:\u003C\u002Fstrong> se você acessa api.binance.com de um IP dos EUA sem geo-targeting, pode receber 451. Configure \u003Ccode>-country-XX\u003C\u002Fcode> apropriadamente.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Configuração específica do ProxyHat\u003C\u002Fh2>\n\n\u003Cp>Para começar com o ProxyHat, acesse o \u003Ca href=\"\u002Fpt\u002Fpricing\">dashboard de preços\u003C\u002Fa> e escolha um plano residencial. A configuração é imediata — sem SDK proprietário obrigatório, apenas HTTP\u002FSOCKS5 com flags no username.\u003C\u002Fp>\n\n\u003Cp>Consulte a \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentação oficial do ProxyHat\u003C\u002Fa> para detalhes sobre geo-targeting por cidade, rotação por header e integrações avançadas.\u003C\u002Fp>\n\n\u003Cp>Para casos de uso de web scraping em geral, veja nosso guia de \u003Ca href=\"\u002Fpt\u002Fuse-cases\u002Fweb-scraping\">web scraping com proxies\u003C\u002Fa>. Para rastreamento de SERPs, confira \u003Ca href=\"\u002Fpt\u002Fuse-cases\u002Fserp-tracking\">SERP tracking com proxies\u003C\u002Fa>. A lista completa de localizações disponíveis está em \u003Ca href=\"\u002Fpt\u002Flocations\">proxy locations\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Pontos-chave\u003C\u002Fh2>\n\n\u003Cblockquote>\n\u003Cul>\n\u003Cli>\u003Cstrong>Peso, não requisições:\u003C\u002Fstrong> a Binance limita por peso (6.000\u002Fmin por IP), não por count. \u003Ccode>\u002Fapi\u002Fv3\u002Fdepth\u003C\u002Fcode> com limit=1000 custa 20 pesos por chamada.\u003C\u002Fli>\n\u003Cli>Monitore X-MBX-USED-WEIGHT-1M: esse cabeçalho é seu medidor de combustível. Sem ele, você opera no escuro.\u003C\u002Fli>\n\u003Cli>429 é aviso, 418 é banimento: respeite \u003Ccode>Retry-After\u003C\u002Fcode> sempre. Ignorar 429 leva a 418 com bans de horas a dias.\u003C\u002Fli>\n\u003Cli>Residenciais &gt; datacenter: IPs residenciais rotativos distribuem peso across múltiplos orçamentos e evitam penalizações de ranges conhecidos.\u003C\u002Fli>\n\u003Cli>Sessão fixa para paginação: use \u003Ccode>-sid-XXX\u003C\u002Fcode> para manter o mesmo IP durante backfill. Rotação por requisição para coletas independentes.\u003C\u002Fli>\n\u003Cli>WebSocket para tempo real: para monitoramento contínuo, streams são mais eficientes que REST polling.\u003C\u002Fli>\n\u003Cli>Geo-targeting resolve 451: use \u003Ccode>-country-XX\u003C\u002Fcode> para bypassar bloqueios regionais e acessar endpoints globais.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>","Limites de peso em APIs cripto e proxies (Binance) | ProxyHat","Guia para raspar a API REST da Binance com proxies: endpoints, peso, rate limit, rotação de IPs residenciais, exemplos em Python e Node.js com retries e backoff.","\u002Fpt\u002Fblog\u002Fcomo-raspar-api-binance-proxies",null,"Dados de mercado cripto: limites de peso e proxies | ProxyHat","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-raspar-api-binance-proxies-og.webp",[18,21,24,27],{"question":19,"answer":20},"Por que raspar a API REST da Binance com proxies importa para usuários de proxy?","Porque a Binance penaliza agressivamente IPs que excedem o orçamento de peso. Sem proxies, um único IP é banido em minutos ao fazer polling de depth. Com proxies residenciais rotativos, cada IP tem seu próprio orçamento, multiplicando a capacidade de coleta. Além disso, o geo-targeting via username (-country-XX) resolve bloqueios regionais (HTTP 451) que afetam usuários em jurisdições restritas como os EUA.",{"question":22,"answer":23},"Qual tipo de proxy funciona melhor para raspar a API REST da Binance?","Proxies residenciais rotativos são os melhores porque aparecem como tráfego de usuários finais legítimos e não são penalizados como ranges de datacenter. Para backfill paginado, use sessões fixas (-sid-XXX) para manter o mesmo IP e preservar o contexto de peso. Para coletas independentes, rotação por requisição é ideal. SOCKS5 na porta 1080 é útil para clientes que exigem esse protocolo.",{"question":25,"answer":26},"Como evitar bloqueios ao raspar a Binance REST API?","Monitore o cabeçalho X-MBX-USED-WEIGHT-1M em cada resposta e implemente throttling adaptativo: se o peso se aproximar de 5.500, pause por 60s. Trate 429 respeitando Retry-After e nunca continue após receber 418. Use backoff exponencial com jitter para erros de rede. Limite a concorrência com semáforos (10–20 conexões simultâneas). Rotacione IPs por requisição para endpoints independentes e use sessões fixas para paginação.",{"question":28,"answer":29},"Quando devo usar WebSocket em vez de REST polling na Binance?","Use WebSocket (wss:\u002F\u002Fstream.binance.com:9443) para monitoramento contínuo de preço, depth incremental e trade streams. WebSocket não consome peso REST, tem latência menor (~10ms vs 500ms+) e substitui dezenas de polls por minuto. Use REST para backfill histórico de klines paginadas, snapshots pontuais e endpoints sem equivalente WebSocket como \u002Fapi\u002Fv3\u002Fticker\u002F24hr para todos os símbolos de uma vez.",false,"2026-08-03T10:04:04+00:00","2026-10-04T02:43:17+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-raspar-api-binance-proxies-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-raspar-api-binance-proxies-card.webp",12,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[42],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"parent_id":14},4,"guias-desenvolvedores","Guias para Desenvolvedores","Guias para Desenvolvedores | Blog ProxyHat","Tutoriais de código e guias SDK para integrar proxies em suas aplicações.",[],{"fr":50,"ko":51,"ru":52,"zh":53,"pt":13,"en":54,"x-default":54},"\u002Ffr\u002Fblog\u002Fcomment-scraper-api-rest-binance-proxies","\u002Fko\u002Fblog\u002Fbinance-rest-api-proxy-scraping","\u002Fru\u002Fblog\u002Fkak-skrejpit-binance-rest-api-proksi","\u002Fcn\u002Fblog\u002Fbinance-rest-api-proxy-scraping-guide","\u002Fblog\u002Fscrape-binance-rest-api-proxies",{"tr":56,"fr":50,"ja":57,"ko":51,"pl":58,"es":59,"ru":52,"zh":53,"pt":13,"en":54,"it":60,"de":61},"\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","\u002Fit\u002Fblog\u002Fscraping-binance-rest-api-con-proxy","\u002Fde\u002Fblog\u002Fbinance-rest-api-mit-proxies-scrapen",81,[64,80,96,111],{"id":65,"slug":66,"title":67,"excerpt":68,"featured_image_url":69,"featured_image_alt":70,"card_image_url":71,"og_image_url":72,"published_at":73,"updated_at":73,"content_updated_at":74,"reading_time_minutes":36,"is_featured":30,"indexable":30,"views":75,"author":76,"categories":77,"tags":79},176,"guia-got-scraping-nodejs-proxies-residenciais","Guia de got-scraping em Node.js com proxies residenciais","Aprenda a usar got-scraping em Node.js com proxies residenciais: geração de headers coerentes, HTTP\u002F2, rotação de IPs e padrões de produção para scraping em escala.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fguia-got-scraping-nodejs-proxies-residenciais-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fguia-got-scraping-nodejs-proxies-residenciais-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fguia-got-scraping-nodejs-proxies-residenciais-og.webp","2026-08-04T16:05:06+00:00","2026-10-03T08:57:48+00:00",121,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},[78],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"parent_id":14},[],{"id":81,"slug":82,"title":83,"excerpt":84,"featured_image_url":85,"featured_image_alt":86,"card_image_url":87,"og_image_url":88,"published_at":89,"updated_at":89,"content_updated_at":90,"reading_time_minutes":36,"is_featured":30,"indexable":30,"views":91,"author":92,"categories":93,"tags":95},175,"proxies-rotativos-em-colly","Proxies Rotativos em Colly: Guia para Desenvolvedores Go","Aprenda a integrar proxies rotativos residenciais no framework Colly de Go, usando RoundRobinProxySwitcher, SetProxyFunc, sessões sticky e geo-targeting para scraping de alta escala.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fproxies-rotativos-em-colly-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fproxies-rotativos-em-colly-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fproxies-rotativos-em-colly-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T23:53:00+00:00",71,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},[94],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"parent_id":14},[],{"id":97,"slug":98,"title":99,"excerpt":100,"featured_image_url":101,"featured_image_alt":102,"card_image_url":103,"og_image_url":104,"published_at":105,"updated_at":105,"content_updated_at":32,"reading_time_minutes":36,"is_featured":30,"indexable":4,"views":106,"author":107,"categories":108,"tags":110},195,"como-raspar-bybit-v5-market-api-proxies","Como coletar dados de mercado cripto com proxies rotativos (exemplo: Bybit V5 Market API)","Guia prático para desenvolvedores sobre como raspar os endpoints públicos \u002Fv5\u002Fmarket da Bybit com proxies residenciais rotativos via ProxyHat, incluindo rate limits, geo-restrições e WebSocket.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-raspar-bybit-v5-market-api-proxies-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-raspar-bybit-v5-market-api-proxies-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-raspar-bybit-v5-market-api-proxies-og.webp","2026-08-03T16:09:16+00:00",87,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},[109],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"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":36,"is_featured":30,"indexable":30,"views":122,"author":123,"categories":124,"tags":126},172,"usar-proxies-swift-urlsession","Usar Proxies em Swift com URLSession: Guia Completo para iOS e macOS","Aprenda a configurar proxies residenciais em Swift usando URLSession: HTTP, SOCKS5, autenticação, geo-targeting, async\u002Fawait e dicas de produção para iOS e macOS.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fusar-proxies-swift-urlsession-master.webp","Using Proxies in Swift: A Code-First Guide to URLSession, SOCKS5 & Residential IPs","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fusar-proxies-swift-urlsession-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fusar-proxies-swift-urlsession-og.webp","2026-07-26T16:03:44+00:00","2026-10-03T08:57:47+00:00",230,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},[125],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"parent_id":14},[],[]]