[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-pt-proxies-rotativos-em-colly":3},{"success":4,"payload":5,"related":57,"errors":121},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":15,"og_image_url":16,"faq_json":17,"key_takeaways":14,"allow_index":24,"noindex_google_only":24,"allow_follow":4,"published_at":25,"updated_at":25,"content_updated_at":26,"featured_image_url":27,"featured_image_alt":28,"card_image_url":29,"reading_time_minutes":30,"author":31,"categories":35,"tags":42,"alternates":43,"locale_paths":55,"views":56},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.","\u003Cp>Se você está construindo scrapers em Go com \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgocolly\u002Fcolly\" rel=\"noopener noreferrer\">Colly\u003C\u002Fa> e está enfrentando bloqueios de IP, proxies rotativos em Colly são a extensão natural do seu collector. Este guia mostra como usar a API idiomática de proxy do Colly — \u003Ccode>proxy.RoundRobinProxySwitcher\u003C\u002Fcode> e \u003Ccode>c.SetProxyFunc\u003C\u002Fcode>— para integrar proxies residenciais da ProxyHat, com rotação de país, cidade e sessão por requisição.\u003C\u002Fp>\n\u003Cp>Antes de mergulharmos: este artigo cobre técnicas para coletar \u003Cstrong>dados públicos\u003C\u002Fstrong>. Raspar dados atrás de login ou violar Termos de Serviço pode configurar violação do CFAA nos EUA ou processar dados pessoais sob a \u003Ca href=\"https:\u002F\u002Fgdpr.eu\u002F\" rel=\"noopener noreferrer\">GDPR\u003C\u002Fa> na Europa. Respeite \u003Ccode>robots.txt\u003C\u002Fcode>, limite taxas de requisição e consulte a jurisprudência aplicável.\u003C\u002Fp>\n\n\u003Ch2>Como Funcionam os Proxies Rotativos em Colly\u003C\u002Fh2>\n\u003Cp>Colly é um framework de scraping para Go baseado em callbacks. O \u003Ccode>Collector\u003C\u002Fcode> é a unidade central: você registra handlers como \u003Ccode>OnRequest\u003C\u002Fcode>, \u003Ccode>OnHTML\u003C\u002Fcode> e \u003Ccode>OnError\u003C\u002Fcode>, dispara visitas com \u003Ccode>c.Visit()\u003C\u002Fcode>, e o framework gerencia o ciclo HTTP. Por padrão, o collector usa o \u003Ccode>http.DefaultTransport\u003C\u002Fcode> do Go, sem proxy.\u003C\u002Fp>\n\u003Cp>A rotação de proxies entra como uma \u003Cstrong>função de proxy\u003C\u002Fstrong> que o Colly chama antes de cada requisição. O signature é:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>type ProxyFunc func(*http.Request) (*url.URL, error)\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Se essa função retorna uma URL de proxy diferente a cada chamada, você tem rotação automática. O Colly oferece \u003Ccode>proxy.RoundRobinProxySwitcher\u003C\u002Fcode> pronto para uso, mas você pode — e deve, em produção — escrever a sua própria.\u003C\u002Fp>\n\u003Cp>O modelo é assíncrono por natureza: \u003Ccode>c.Visit()\u003C\u002Fcode> retorna imediatamente e o Colly processa a resposta em goroutines internas. Isso significa que a função de proxy é chamada de múltiplas goroutines concorrentemente — seu código precisa ser thread-safe.\u003C\u002Fp>\n\n\u003Ch3>O Modelo de Collector do Colly\u003C\u002Fh3>\n\u003Cp>O collector expõe três categorias de callbacks:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>OnRequest(func(*colly.Request))\u003C\u002Fstrong> — chamado antes da requisição sair; ideal para setar headers, User-Agent e cookies.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>OnHTML(selector string, func(*colly.HTMLElement))\u003C\u002Fstrong> — chamado quando o seletor CSS encontra elementos; usa \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPuerkitoBio\u002Fgoquery\" rel=\"noopener noreferrer\">goquery\u003C\u002Fa> por baixo para traversal de DOM.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>OnError(func(*colly.Response, error))\u003C\u002Fstrong> — chamado em falhas; aqui você implementa retry lógico.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>O \u003Ccode>HTMLElement\u003C\u002Fcode> do callback OnHTML é um wrapper sobre goquery, então você tem acesso a \u003Ccode>e.DOM.Find(...)\u003C\u002Fcode>, \u003Ccode>e.Attr()\u003C\u002Fcode>, \u003Ccode>e.Text()\u003C\u002Fcode> e \u003Ccode>e.ForEach()\u003C\u002Fcode> com a mesma API do jQuery. Isso torna a extração concisa:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>c.OnHTML(&quot;div.result h3&quot;, func(e *colly.HTMLElement) {\n    fmt.Println(e.Text)\n    e.ForEach(&quot;a&quot;, func(_ int, a *colly.HTMLElement) {\n        fmt.Println(a.Attr(&quot;href&quot;))\n    })\n})\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>O modo assíncrono é controlado por \u003Ccode>c.Async = true\u003C\u002Fcode> (padrão \u003Ccode>false\u003C\u002Fcode>). Em assíncrono, você precisa de \u003Ccode>c.Wait()\u003C\u002Fcode> ao final para bloquear até todas as goroutines terminarem.\u003C\u002Fp>\n\n\u003Ch2>Superfície Idiomática de Proxy no Colly\u003C\u002Fh2>\n\u003Cp>O Colly oferece duas formas de configurar proxies. A primeira é o \u003Ccode>RoundRobinProxySwitcher\u003C\u002Fcode>, que distribui requisições em round-robin entre uma lista fixa de URLs de proxy:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fproxy&quot;\n\nswitcher, err := proxy.RoundRobinProxySwitcher(\n    &quot;http:\u002F\u002Fuser:pass@gate.proxyhat.com:8080&quot;,\n    &quot;http:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080&quot;,\n    &quot;http:\u002F\u002Fuser-country-US:pass@gate.proxyhat.com:8080&quot;,\n)\nif err != nil {\n    log.Fatal(err)\n}\nc.SetProxyFunc(switcher)\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>A segunda — mais flexível — é escrever sua própria \u003Ccode>ProxyFunc\u003C\u002Fcode>. Isso permite rotação dinâmica, geo-targeting por requisição, sessões sticky e lógica condicional baseada no domínio alvo:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>func proxyHatSwitcher(req *http.Request) (*url.URL, error) {\n    \u002F\u002F Rotação de país + sessão sticky por domínio\n    country := pickCountry(req.URL.Hostname())\n    session := fmt.Sprintf(&quot;sess-%d&quot;, time.Now().UnixNano()%10000)\n    user := fmt.Sprintf(&quot;user-country-%s-sid-%s&quot;, country, session)\n    proxyURL := fmt.Sprintf(&quot;http:\u002F\u002F%s:pass@gate.proxyhat.com:8080&quot;, user)\n    return url.Parse(proxyURL)\n}\n\nc.SetProxyFunc(proxyHatSwitcher)\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>O Colly suporta esquemas \u003Ccode>http\u003C\u002Fcode>, \u003Ccode>https\u003C\u002Fcode> e \u003Ccode>socks5\u003C\u002Fcode> nativamente. Para SOCKS5 com a ProxyHat, basta usar a porta \u003Ccode>1080\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>proxyURL := &quot;socks5:\u002F\u002Fuser:pass@gate.proxyhat.com:1080&quot;\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Por Que Proxies Residenciais para Alvos Difíceis\u003C\u002Fh2>\n\u003Cp>Proxies datacenter são bloqueados rapidamente por anti-bot systems como Cloudflare, Datadome e PerimeterX, que mantêm listas de ASN de datacenter. Proxies residenciais usam IPs atribuídos a ISPs reais, tornando-os indistinguíveis de tráfego orgânico. Para alvos com proteção agressiva — e-commerce, SERPs, redes sociais — residenciais são obrigatórios.\u003C\u002Fp>\n\u003Cp>A ProxyHat permite geo-targeting granular via flags no username. O formato é:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>user-country-DE:pass\u003C\u002Fcode> — IP alemão aleatório\u003C\u002Fli>\n\u003Cli>\u003Ccode>user-country-DE-region-state_of_berlin-city-berlin:pass\u003C\u002Fcode> — IP de Berlim\u003C\u002Fli>\n\u003Cli>\u003Ccode>user-sid-abc123:pass\u003C\u002Fcode> — sessão sticky (mesmo IP por toda a sessão)\u003C\u002Fli>\n\u003Cli>\u003Ccode>user-country-US-sid-abc123:pass\u003C\u002Fcode> — país + sessão combinados\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Combinando isso com sua \u003Ccode>ProxyFunc\u003C\u002Fcode>, você pode garantir que cada requisição saia de um IP diferente, ou manter a mesma sessão para fluxos de login multi-step.\u003C\u002Fp>\n\n\u003Ch2>Exemplo Runnable: Collector com Rotação Residencial\u003C\u002Fh2>\n\u003Cp>Aqui está um exemplo completo de scraper Colly com rotação de proxies residenciais, limites de taxa e tratamento de erros:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>package main\n\nimport (\n    &quot;fmt&quot;\n    &quot;log&quot;\n    &quot;math\u002Frand&quot;\n    &quot;net\u002Fhttp&quot;\n    &quot;net\u002Furl&quot;\n    &quot;time&quot;\n\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fproxy&quot;\n)\n\nvar countries = []string{&quot;US&quot;, &quot;DE&quot;, &quot;GB&quot;, &quot;FR&quot;, &quot;BR&quot;, &quot;JP&quot;}\n\nfunc pickCountry() string {\n    return countries[rand.Intn(len(countries))]\n}\n\nfunc residentialSwitcher(req *http.Request) (*url.URL, error) {\n    country := pickCountry()\n    session := fmt.Sprintf(&quot;sess-%d&quot;, rand.Intn(100000))\n    user := fmt.Sprintf(&quot;user-country-%s-sid-%s&quot;, country, session)\n    proxyStr := fmt.Sprintf(&quot;http:\u002F\u002F%s:PASSWORD@gate.proxyhat.com:8080&quot;, user)\n    return url.Parse(proxyStr)\n}\n\nfunc main() {\n    rand.Seed(time.Now().UnixNano())\n\n    c := colly.NewCollector(\n        colly.MaxDepth(2),\n        colly.UserAgent(&quot;Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64)&quot;),\n    )\n\n    \u002F\u002F Rotação de proxy residencial\n    if err := c.SetProxyFunc(residentialSwitcher); err != nil {\n        log.Fatal(err)\n    }\n\n    \u002F\u002F Limites de taxa: 2 requisições\u002Fsegundo, paralelismo 4\n    c.Limit(&amp;colly.LimitRule{\n        DomainGlob:  &quot;*&quot;,\n        Parallelism: 4,\n        Delay:       500 * time.Millisecond,\n        RandomDelay: 500 * time.Millisecond,\n    })\n\n    c.OnRequest(func(r *colly.Request) {\n        r.Headers.Set(&quot;Accept-Language&quot;, &quot;en-US,en;q=0.9&quot;)\n        fmt.Printf(&quot;Visitando %s via proxy\\n&quot;, r.URL.String())\n    })\n\n    c.OnHTML(&quot;h1&quot;, func(e *colly.HTMLElement) {\n        fmt.Printf(&quot;Título: %s\\n&quot;, e.Text)\n    })\n\n    c.OnError(func(r *colly.Response, err error) {\n        fmt.Printf(&quot;Erro em %s: %v (status %d)\\n&quot;, r.Request.URL, err, r.StatusCode)\n        \u002F\u002F Retry com clone\n        if r.StatusCode == 403 || r.StatusCode == 429 {\n            time.Sleep(2 * time.Second)\n            r.Request.Retry()\n        }\n    })\n\n    c.OnScraped(func(r *colly.Response) {\n        r.Visit(&quot;https:\u002F\u002Fexample.com\u002Fpage2&quot;)\n    })\n\n    c.Visit(&quot;https:\u002F\u002Fexample.com&quot;)\n    c.Wait()\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Este exemplo cobre os três pilares: rotação de proxy por requisição, controle de taxa via \u003Ccode>Limit()\u003C\u002Fcode> e retry automático em 403\u002F429. O \u003Ccode>RandomDelay\u003C\u002Fcode> de 500ms adiciona jitter para evitar padrões detectáveis.\u003C\u002Fp>\n\n\u003Ch3>Switcher Customizado com Lista de Endpoints\u003C\u002Fh3>\n\u003Cp>Para controle mais fino, você pode ler uma lista de configurações de proxy de um arquivo ou API e construir um switcher que combina round-robin com geo-targeting:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>type proxyConfig struct {\n    Country string\n    Region  string\n    City   string\n    Session string\n}\n\ntype smartSwitcher struct {\n    configs []proxyConfig\n    idx     uint32\n}\n\nfunc (s *smartSwitcher) GetProxy(req *http.Request) (*url.URL, error) {\n    n := atomic.AddUint32(&amp;s.idx, 1)\n    cfg := s.configs[int(n)%len(s.configs)]\n    user := fmt.Sprintf(&quot;user-country-%s&quot;, cfg.Country)\n    if cfg.Region != &quot;&quot; &amp;&amp; cfg.City != &quot;&quot; {\n        user += fmt.Sprintf(&quot;-region-%s-city-%s&quot;, cfg.Region, cfg.City)\n    } else if cfg.Region != &quot;&quot; {\n        user += fmt.Sprintf(&quot;-region-%s&quot;, cfg.Region)\n    }\n    if cfg.Session != &quot;&quot; {\n        user += fmt.Sprintf(&quot;-sid-%s&quot;, cfg.Session)\n    }\n    proxyStr := fmt.Sprintf(&quot;http:\u002F\u002F%s:PASSWORD@gate.proxyhat.com:8080&quot;, user)\n    return url.Parse(proxyStr)\n}\n\n\u002F\u002F Uso:\nswitcher := &amp;smartSwitcher{configs: loadConfigs()}\nc.SetProxyFunc(switcher.GetProxy)\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Usar \u003Ccode>atomic.AddUint32\u003C\u002Fcode> garante thread-safety entre goroutines concorrentes — algo essencial quando \u003Ccode>Parallelism > 1\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Ch2>Padrões de Produção para Scraping em Escala\u003C\u002Fh2>\n\n\u003Ch3>Retries com c.Clone()\u003C\u002Fh3>\n\u003Cp>O método \u003Ccode>c.Clone()\u003C\u002Fcode> cria uma cópia do collector com os mesmos callbacks e configurações. Isso é útil para isolamento de retry — você pode clonar o collector com um proxy diferente e re-tentar sem afetar o estado do collector principal:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>c.OnError(func(r *colly.Response, err error) {\n    if r.StatusCode &gt;= 500 || r.StatusCode == 429 {\n        clone := c.Clone()\n        \u002F\u002F O clone herda a ProxyFunc, mas você pode sobrescrever\n        time.Sleep(time.Duration(r.StatusCode-400) * time.Second)\n        clone.Visit(r.Request.URL.String())\n    }\n})\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>RandomDelay e Parallelism\u003C\u002Fh3>\n\u003Cp>O \u003Ccode>LimitRule\u003C\u002Fcode> controla três dimensões de taxa:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Parallelism — número máximo de requisições concorrentes por domínio.\u003C\u002Fli>\n\u003Cli>Delay — espera fixa entre requisições ao mesmo domínio.\u003C\u002Fli>\n\u003Cli>RandomDelay — jitter aleatório adicionado ao Delay.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Para scraping respeitoso, use \u003Ccode>Parallelism: 2-5\u003C\u002Fcode>, \u003Ccode>Delay: 1s\u003C\u002Fcode> e \u003Ccode>RandomDelay: 2s\u003C\u002Fcode>. Isso resulta em 1 requisição a cada 1-3 segundos por domínio — abaixo do radar da maioria dos anti-bots.\u003C\u002Fp>\n\n\u003Ch3>Transport TLS Customizado\u003C\u002Fh3>\n\u003Cp>Para alvos que fazem fingerprinting de TLS (JA3), você pode customizar o \u003Ccode>http.Transport\u003C\u002Fcode> do collector:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>c.WithTransport(&amp;http.Transport{\n    TLSClientConfig: &amp;tls.Config{\n        MinVersion:         tls.VersionTLS12,\n        MaxVersion:         tls.VersionTLS13,\n        InsecureSkipVerify: false,\n        CipherSuites: []uint16{\n            tls.TLS_AES_128_GCM_SHA256,\n            tls.TLS_CHACHA20_POLY1305_SHA256,\n        },\n    },\n    Proxy: http.ProxyFromEnvironment,\n    DialContext: (&amp;net.Dialer{\n        Timeout:   30 * time.Second,\n        KeepAlive: 30 * time.Second,\n    }).DialContext,\n})\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Para fingerprinting mais avançado, considere usar \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Frefraction-networking\u002Futls\" rel=\"noopener noreferrer\">uTLS\u003C\u002Fa> que permite imitar o ClientHello de navegadores reais.\u003C\u002Fp>\n\n\u003Ch3>Scraping Distribuído com Redis\u003C\u002Fh3>\n\u003Cp>Para distribuir scraping entre múltiplas máquinas, o Colly oferece backends de storage. O \u003Ccode>redisstorage\u003C\u002Fcode> permite que múltiplas instâncias compartilhem a fila de URLs visitadas e cookies:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import &quot;github.com\u002Fgocolly\u002Fredisstorage&quot;\n\nstorage := &amp;redisstorage.Storage{\n    Address:  &quot;redis:\u002F\u002Flocalhost:6379&quot;,\n    Prefix:   &quot;colly_scraper&quot;,\n}\nc.SetStorage(storage)\n\u002F\u002F Deduplicação automática: URLs visitados não são re-visitados\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Com 3-5 instâncias, cada uma rodando com \u003Ccode>Parallelism: 4\u003C\u002Fcode>, você pode sustentar 1500+ requisições por minuto sem sobrecarregar um único host. O Redis garante que nenhuma instância repita trabalho já feito por outra.\u003C\u002Fp>\n\n\u003Ch2>Quando NÃO Usar Colly\u003C\u002Fh2>\n\u003Cp>Colly é excelente para HTML estático e páginas server-rendered. Mas se o alvo é uma SPA (Single Page Application) que renderiza conteúdo via JavaScript — React, Vue, Angular — o Colly não executa JS. Nesses casos, você precisa de um browser headless:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>chromedp — controle Chrome via DevTools Protocol em Go, nativo.\u003C\u002Fli>\n\u003Cli>rod — alternativa mais simples ao chromedp, com API fluente.\u003C\u002Fli>\n\u003Cli>Playwright Go — porta do Playwright para Go, com suporte a Chromium\u002FFirefox\u002FWebKit.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Com browsers headless, você ainda pode usar proxies residenciais da ProxyHat via flag \u003Ccode>--proxy-server\u003C\u002Fcode> do Chrome ou configuração do Playwright. A diferença é que o browser resolve JavaScript antes da extração.\u003C\u002Fp>\n\u003Cp>Um sinal claro de que você precisa de um browser: o HTML retornado pelo Colly não contém o conteúdo que você vê no navegador — apenas um \u003Ccode>&lt;div id=\"root\"&gt;&lt;\u002Fdiv&gt;\u003C\u002Fcode> vazio.\u003C\u002Fp>\n\n\u003Ch2>Comparação: Tipos de Proxy no Colly\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Característica\u003C\u002Fth>\u003Cth>Datacenter\u003C\u002Fth>\u003Cth>Residencial\u003C\u002Fth>\u003Cth>Mobile\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Velocidade\u003C\u002Ftd>\u003Ctd>~50ms\u003C\u002Ftd>\u003Ctd>~200-800ms\u003C\u002Ftd>\u003Ctd>~500-2000ms\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Taxa de bloqueio\u003C\u002Ftd>\u003Ctd>Alta (40-60%)\u003C\u002Ftd>\u003Ctd>Baixa (5-15%)\u003C\u002Ftd>\u003Ctd>Muito baixa (&lt;5%)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Custo\u003C\u002Ftd>\u003Ctd>$$$\u003C\u002Ftd>\u003Ctd>$$$$\u003C\u002Ftd>\u003Ctd>$$$$$\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Ideal para\u003C\u002Ftd>\u003Ctd>Scraping leve, APIs públicas\u003C\u002Ftd>\u003Ctd>Scraping de SERPs, e-commerce\u003C\u002Ftd>\u003Ctd>Apps mobile, redes sociais\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Geo-targeting\u003C\u002Ftd>\u003Ctd>Limitado\u003C\u002Ftd>\u003Ctd>País + cidade\u003C\u002Ftd>\u003Ctd>País + cidade + operadora\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Para a maioria dos casos de \u003Ca href=\"\u002Fpt\u002Fuse-cases\u002Fweb-scraping\">web scraping\u003C\u002Fa> e \u003Ca href=\"\u002Fpt\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa>, proxies residenciais oferecem o melhor equilíbrio custo-benefício. Confira as \u003Ca href=\"\u002Fpt\u002Flocations\">localizações disponíveis\u003C\u002Fa> e o \u003Ca href=\"\u002Fpt\u002Fpricing\">plano de preços\u003C\u002Fa> da ProxyHat.\u003C\u002Fp>\n\n\u003Ch2>Considerações Éticas e Legais\u003C\u002Fh2>\n\u003Cp>Scraping de dados públicos é geralmente legal, mas o cenário é complexo:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>CFAA (EUA) — acessar sistemas sem autorização pode configurar crime federal. Evite alvos que exigem bypass de autenticação.\u003C\u002Fli>\n\u003Cli>GDPR (UE) — dados pessoais são protegidos. Se você coleta emails, nomes ou IPs, precisa de base legal.\u003C\u002Fli>\n\u003Cli>robots.txt — respeite. O Colly não lê robots.txt automaticamente; você deve implementar isso.\u003C\u002Fli>\n\u003Cli>Rate limiting — não sobrecarregue o servidor alvo. 1-5 req\u002Fsegundo é razoável.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Para uma discussão mais profunda sobre o framework, consulte a \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentação da ProxyHat\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Principais Conclusões\u003C\u002Fh2>\n\u003Cblockquote>\n\u003Cp>Key Takeaways:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Use \u003Ccode>c.SetProxyFunc()\u003C\u002Fcode> com uma \u003Ccode>ProxyFunc\u003C\u002Fcode> customizada para rotação dinâmica de proxies residenciais — é mais flexível que \u003Ccode>RoundRobinProxySwitcher\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Geo-targeting e sessões sticky são controlados via flags no username: \u003Ccode>user-country-DE-region-state_of_berlin-city-berlin-sid-abc123\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Sempre configure \u003Ccode>Limit()\u003C\u002Fcode> com \u003Ccode>Parallelism\u003C\u002Fcode>, \u003Ccode>Delay\u003C\u002Fcode> e \u003Ccode>RandomDelay\u003C\u002Fcode> para evitar bloqueios e ser respeitoso.\u003C\u002Fli>\n\u003Cli>Use \u003Ccode>c.Clone()\u003C\u002Fcode> para retries isolados e \u003Ccode>redisstorage\u003C\u002Fcode> para scraping distribuído entre múltiplas máquinas.\u003C\u002Fli>\n\u003Cli>Colly não executa JavaScript — para SPAs, use chromedp ou Playwright Go com proxies residenciais.\u003C\u002Fli>\n\u003Cli>Proxies residenciais oferecem 85-95% de taxa de sucesso contra 40-60% de datacenter em alvos protegidos.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>","Proxies Rotativos em Colly: Guia Go | ProxyHat","Aprenda proxies rotativos em Colly com SetProxyFunc, RoundRobinProxySwitcher, sessões sticky e geo-targeting. Exemplos runnable em Go para scraping de escala.","\u002Fpt\u002Fblog\u002Fproxies-rotativos-em-colly",null,"Guia completo de proxies rotativos em Colly com exemplos em Go, rotação residencial, geo-targeting e padrões de produção.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fproxies-rotativos-em-colly-og.webp",[18,21],{"question":19,"answer":20},"Por que proxies rotativos importam para usuários de proxy no Colly?","Sem rotação, todas as requisições saem do mesmo IP, que é rapidamente bloqueado por sistemas anti-bot após 50-200 requisições. Com rotação residencial, cada requisição pode sair de um IP de ISP diferente, tornando o tráfego indistinguível de visitantes orgânicos. Isso aumenta a taxa de sucesso de 40-60% (datacenter sem rotação) para 85-95% (residencial com rotação), especialmente em alvos como SERPs, e-commerce e redes sociais com proteção agressiva.",{"question":22,"answer":23},"Como evitar bloqueios ao implementar proxies rotativos em Colly?","Combine quatro estratégias: rotação de proxy residencial com SetProxyFunc mudando país\u002Fsessão por requisição; limites de taxa via c.Limit() com Parallelism 4, Delay 1s e RandomDelay 2s; User-Agent e headers realistas via OnRequest; retries com backoff exponencial em OnError para status 429\u002F403. Respeite robots.txt e não exceda 5 requisições por segundo por domínio.",false,"2026-08-04T10:05:34+00:00","2026-10-03T23:53:00+00:00","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",12,{"name":32,"slug":33,"bio":34,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[36],{"id":37,"slug":38,"name":39,"description":14,"meta_title":40,"meta_description":41,"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.",[],{"es":44,"ru":45,"ja":46,"pt":13,"pl":47,"ko":48,"tr":49,"zh":50,"it":51,"de":52,"en":53,"fr":54,"x-default":53},"\u002Fes\u002Fblog\u002Frotacion-proxies-colly-golang-1","\u002Fru\u002Fblog\u002Frotaciya-proksi-v-colly-1","\u002Fja\u002Fblog\u002Fcolly-purokushi-roteshon-gaido","\u002Fpl\u002Fblog\u002Frotacja-proxy-w-colly-1","\u002Fko\u002Fblog\u002Fcolly-rotating-proxy-guide","\u002Ftr\u002Fblog\u002Fcolly-doner-proxy-rehberi","\u002Fcn\u002Fblog\u002Fcolly-lunhuan-daili-shixian-zhinan","\u002Fit\u002Fblog\u002Fproxy-rotanti-in-colly-guida","\u002Fde\u002Fblog\u002Frotierende-proxies-in-colly","\u002Fblog\u002Frotating-proxies-in-colly-golang","\u002Ffr\u002Fblog\u002Frotation-proxies-colly-golang-1",{"es":44,"ru":45,"ja":46,"pt":13,"pl":47,"ko":48,"tr":49,"zh":50,"it":51,"de":52,"en":53,"fr":54},71,[58,74,90,105],{"id":59,"slug":60,"title":61,"excerpt":62,"featured_image_url":63,"featured_image_alt":64,"card_image_url":65,"og_image_url":66,"published_at":67,"updated_at":67,"content_updated_at":68,"reading_time_minutes":30,"is_featured":24,"indexable":24,"views":69,"author":70,"categories":71,"tags":73},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":32,"slug":33,"bio":34,"avatar_url":14,"website_url":14,"social_links":14},[72],{"id":37,"slug":38,"name":39,"description":14,"meta_title":40,"meta_description":41,"parent_id":14},[],{"id":75,"slug":76,"title":77,"excerpt":78,"featured_image_url":79,"featured_image_alt":80,"card_image_url":81,"og_image_url":82,"published_at":83,"updated_at":83,"content_updated_at":84,"reading_time_minutes":30,"is_featured":24,"indexable":4,"views":85,"author":86,"categories":87,"tags":89},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","2026-10-04T02:43:17+00:00",87,{"name":32,"slug":33,"bio":34,"avatar_url":14,"website_url":14,"social_links":14},[88],{"id":37,"slug":38,"name":39,"description":14,"meta_title":40,"meta_description":41,"parent_id":14},[],{"id":91,"slug":92,"title":93,"excerpt":94,"featured_image_url":95,"featured_image_alt":96,"card_image_url":97,"og_image_url":98,"published_at":99,"updated_at":99,"content_updated_at":84,"reading_time_minutes":30,"is_featured":24,"indexable":4,"views":100,"author":101,"categories":102,"tags":104},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.","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","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-raspar-api-binance-proxies-og.webp","2026-08-03T10:04:04+00:00",82,{"name":32,"slug":33,"bio":34,"avatar_url":14,"website_url":14,"social_links":14},[103],{"id":37,"slug":38,"name":39,"description":14,"meta_title":40,"meta_description":41,"parent_id":14},[],{"id":106,"slug":107,"title":108,"excerpt":109,"featured_image_url":110,"featured_image_alt":111,"card_image_url":112,"og_image_url":113,"published_at":114,"updated_at":114,"content_updated_at":115,"reading_time_minutes":30,"is_featured":24,"indexable":24,"views":116,"author":117,"categories":118,"tags":120},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",234,{"name":32,"slug":33,"bio":34,"avatar_url":14,"website_url":14,"social_links":14},[119],{"id":37,"slug":38,"name":39,"description":14,"meta_title":40,"meta_description":41,"parent_id":14},[],[]]