[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-it-proxy-rotanti-in-colly-guida":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":60,"views":61},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.","\u003Ch2>Proxy Rotanti in Colly: perché servono e come configurarli\u003C\u002Fh2>\n\u003Cp>Se stai costruendo uno scraper in Go con \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgocolly\u002Fcolly\" rel=\"noopener noreferrer\">Colly\u003C\u002Fa>, prima o poi ti scontri con i limiti di frequenza dei siti target. Un singolo IP che invia centinaia di richieste al minuto viene bloccato rapidamente — spesso dopo sole 100–200 richieste su endpoint protetti. I proxy rotanti in Colly risolvono il problema distribuendo il traffico su un pool di IP, idealmente residenziali, in modo che ogni richiesta sembri provenire da un utente diverso.\u003C\u002Fp>\n\u003Cp>Prima di entrare nei dettagli tecnici, una precisazione etica e legale: raccogli solo dati pubblicamente accessibili, rispetta il file \u003Ccode>robots.txt\u003C\u002Fcode>, i termini di servizio e le normative come il \u003Ca href=\"https:\u002F\u002Fgdpr.eu\u002F\" rel=\"noopener noreferrer\">GDPR\u003C\u002Fa> e il CFAA. Lo scraping di dati personali o dietro autenticazione senza consenso è illegale in molte giurisdizioni. Questa guida presuppone che tu operi su dati pubblici e in conformità con le normative applicabili.\u003C\u002Fp>\n\u003Cp>Colly è il framework di scraping de facto per Go, basato su \u003Ccode>net\u002Fhttp\u003C\u002Fcode> e \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPuerkitoBio\u002Fgoquery\" rel=\"noopener noreferrer\">goquery\u003C\u002Fa> per il traversal del DOM. Supporta callback asincrone, limiti di parallelismo, storage backend (Redis, in-memory) e — aspetto cruciale — un'interfaccia nativa per il proxy switching. In questa guida vedrai come usarla correttamente, senza hack, integrando i proxy residenziali di ProxyHat.\u003C\u002Fp>\n\n\u003Ch2>Il modello Collector di Colly: callback, async e goquery\u003C\u002Fh2>\n\u003Cp>Il cuore di Colly è il \u003Ccode>Collector\u003C\u002Fcode>, che orchesta il ciclo di vita di ogni richiesta HTTP. I punti di estensione principali sono tre callback:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>OnRequest\u003C\u002Fstrong>: eseguito prima che la richiesta venga inviata. È qui che puoi modificare header, User-Agent, cookie e — in alcuni casi — il proxy per-request.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>OnHTML\u003C\u002Fstrong>: eseguito quando il body HTML è disponibile. Usa selettori CSS goquery per estrarre dati e fare scraping ricorsivo con \u003Ccode>c.Visit()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>OnError\u003C\u002Fstrong>: eseguito in caso di errore HTTP o di parsing. È il posto giusto per logica di retry, backoff e cambio proxy.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Colly opera in modalità asincrona per default: ogni \u003Ccode>c.Visit()\u003C\u002Fcode> viene accodato e le richieste vengono eseguite in goroutine separate, regolate da \u003Ccode>Limit()\u003C\u002Fcode>. Questo significa che il proxy switching deve essere thread-safe — un dettaglio che vedremo nella sezione sull'implementazione.\u003C\u002Fp>\n\u003Cp>Il traversal del DOM è gestito da goquery, un port di jQuery in Go. Le API sono familiari: \u003Ccode>Find()\u003C\u002Fcode>, \u003Ccode>Each()\u003C\u002Fcode>, \u003Ccode>Attr()\u003C\u002Fcode>, \u003Ccode>Text()\u003C\u002Fcode>. Non c'è motore JavaScript: se il sito target è una SPA che renderizza tutto lato client, Colly non basta e serve un browser headless (vedi la sezione finale).\u003C\u002Fp>\n\n\u003Ch2>La superficie idiomatica dei proxy: SetProxyFunc e RoundRobinProxySwitcher\u003C\u002Fh2>\n\u003Cp>Colly espone due livelli per gestire i proxy:\u003C\u002Fp>\n\u003Col>\n\u003Cli>proxy.RoundRobinProxySwitcher(urls ...string): uno switcher round-robin predefinito. Gli passi una lista di URL proxy e Colly li cicla in ordine. Semplice, ma limitato — non supporta logiche di rotazione avanzate.\u003C\u002Fli>\n\u003Cli>c.SetProxyFunc(func(*http.Request) (*url.URL, error)): il punto di estensione vero. Gli passi una funzione custom che riceve la richiesta e restituisce l'URL del proxy da usare. Qui puoi implementare qualsiasi strategia: round-robin, random, sticky session, geo-targeting per dominio.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>La firma \u003Ccode>func(*http.Request) (*url.URL, error)\u003C\u002Fcode> è la stessa del campo \u003Ccode>ProxyURL\u003C\u002Fcode> di \u003Ccode>http.Transport\u003C\u002Fcode> in Go standard. Questo significa che il proxy switching in Colly è completamente compatibile con l'ecosistema \u003Ccode>net\u002Fhttp\u003C\u002Fcode> — puoi usare qualsiasi proxy che supporti i formati \u003Ccode>http:\u002F\u002F\u003C\u002Fcode>, \u003Ccode>https:\u002F\u002F\u003C\u002Fcode> o \u003Ccode>socks5:\u002F\u002F\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Per ProxyHat, i formati sono:\u003C\u002Fp>\n\u003Cpre>\u003Ccode># HTTP\nhttp:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:8080\n\n# SOCKS5\nsocks5:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:1080\n\n# Geo-targeting (Germania, Berlino)\nhttp:\u002F\u002Fuser-country-DE-region-state_of_berlin-city-berlin:pass@gate.proxyhat.com:8080\n\n# Sessione sticky\nhttp:\u002F\u002Fuser-sid-abc123:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>La rotazione avviene a livello di username: ogni combinazione di \u003Ccode>country\u003C\u002Fcode>, \u003Ccode>city\u003C\u002Fcode> e \u003Ccode>session\u003C\u002Fcode> produce un IP diverso. Non hai bisogno di gestire una pool di IP manualmente — ProxyHat lo fa per te.\u003C\u002Fp>\n\n\u003Ch2>Perché i proxy residenziali sono necessari per target difficili\u003C\u002Fh2>\n\u003Cp>I proxy datacenter sono veloci ed economici, ma i loro range IP sono noti e facilmente filtrabili. Servizi anti-bot come Cloudflare, Datadome e PerimeterX bloccano attivamente gli IP ASN datacenter con una precisione che spesso supera il 95% sulle richieste automatizzate.\u003C\u002Fp>\n\u003Cp>I proxy residenziali, invece, usano IP assegnati a dispositivi reali tramite ISP. Per il sito target, il traffico appare identico a quello di un utente legittimo. Questo li rende essenziali per:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>SERP scraping (Google, Bing, Yandex)\u003C\u002Fli>\n\u003Cli>Price monitoring su e-commerce protetti\u003C\u002Fli>\n\u003Cli>Social media research\u003C\u002Fli>\n\u003Cli>Raccolta di dati per training di modelli AI\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Con ProxyHat, la rotazione residenziale è trasparente: basta cambiare il parametro \u003Ccode>session\u003C\u002Fcode> nello username per ottenere un nuovo IP. Una sessione sticky mantiene lo stesso IP per tutta la durata della sessione — utile quando il sito target richiede login o carrello persistente.\u003C\u002Fp>\n\n\u003Ch2>Esempio Go: Collector con RoundRobinProxySwitcher residenziale\u003C\u002Fh2>\n\u003Cp>Vediamo un esempio completo e runnable. L'obiettivo: scraperare una lista di URL usando proxy residenziali con rotazione, limiti di parallelismo e retry.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>package main\n\nimport (\n\t&quot;fmt&quot;\n\t&quot;log&quot;\n\t&quot;math\u002Frand&quot;\n\t&quot;net\u002Furl&quot;\n\t&quot;sync\u002Fatomic&quot;\n\t&quot;time&quot;\n\n\t&quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n\t&quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fproxy&quot;\n)\n\n\u002F\u002F residentialSwitcher implementa una rotazione custom\n\u002F\u002F con geo-targeting e sessioni sticky per-request.\ntype residentialSwitcher struct {\n\tidx uint64\n\tcountries []string\n}\n\nfunc (r *residentialSwitcher) getProxy(req *http.Request) (*url.URL, error) {\n\t\u002F\u002F Rotazione round-robin sui paesi\n\tn := atomic.AddUint64(&amp;r.idx, 1)\n\tcountry := r.countries[n%uint64(len(r.countries))]\n\n\t\u002F\u002F Sessione unica per request: forza nuovo IP\n\tsession := fmt.Sprintf(&quot;sess-%d-%d&quot;, time.Now().UnixNano(), rand.Intn(99999))\n\n\tproxyURL := fmt.Sprintf(\n\t\t&quot;http:\u002F\u002Fuser-country-%s-sid-%s:PASSWORD@gate.proxyhat.com:8080&quot;,\n\t\tcountry, session,\n\t)\n\treturn url.Parse(proxyURL)\n}\n\nfunc main() {\n\tc := colly.NewCollector(\n\t\tcolly.UserAgent(&quot;Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64)&quot;),\n\t\tcolly.MaxDepth(2),\n\t\tcolly.AllowURLRevisit(),\n\t)\n\n\t\u002F\u002F Switcher custom con geo-rotazione\n\tswitcher := &amp;residentialSwitcher{\n\t\tcountries: []string{&quot;DE&quot;, &quot;US&quot;, &quot;FR&quot;, &quot;GB&quot;, &quot;IT&quot;},\n\t}\n\tc.SetProxyFunc(switcher.getProxy)\n\n\t\u002F\u002F Limiti: 5 richieste concorrenti, delay random 1-3s\n\tc.Limit(&amp;colly.LimitRule{\n\t\tDomainGlob:  &quot;*&quot;,\n\t\tParallelism: 5,\n\t\tDelay:       1 * time.Second,\n\t\tRandomDelay: 2 * time.Second,\n\t})\n\n\t\u002F\u002F Retry su errori 429\u002F503\n\tretries := 0\n\tc.OnError(func(r *colly.Response, err error) {\n\t\tif retries &lt; 3 &amp;&amp; (r.StatusCode == 429 || r.StatusCode == 503) {\n\t\t\tretries++\n\t\t\ttime.Sleep(time.Duration(retries*2) * time.Second)\n\t\t\tr.Request.Retry()\n\t\t}\n\t})\n\n\tc.OnHTML(&quot;a[href]&quot;, func(e *colly.HTMLElement) {\n\t\tlink := e.Attr(&quot;href&quot;)\n\t\tfmt.Printf(&quot;Link trovato: %s\\n&quot;, link)\n\t})\n\n\tc.OnResponse(func(r *colly.Response) {\n\t\tfmt.Printf(&quot;[%d] %s - %d bytes\\n&quot;, r.StatusCode, r.Request.URL, len(r.Body))\n\t})\n\n\turls := []string{\n\t\t&quot;https:\u002F\u002Fexample.com\u002Fpage1&quot;,\n\t\t&quot;https:\u002F\u002Fexample.com\u002Fpage2&quot;,\n\t\t&quot;https:\u002F\u002Fexample.com\u002Fpage3&quot;,\n\t}\n\tfor _, u := range urls {\n\t\tc.Visit(u)\n\t}\n\tc.Wait()\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Notare l'uso di \u003Ccode>atomic.AddUint64\u003C\u002Fcode> per il contatore: è obbligatorio perché Colly esegue le richieste in goroutine concorrenti e un contatore non atomico causerebbe data race.\u003C\u002Fp>\n\u003Cp>Per uno switcher più semplice, puoi usare \u003Ccode>proxy.RoundRobinProxySwitcher\u003C\u002Fcode> con una lista di URL pre-generati:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F\u002F Genera 10 URL proxy con sessioni diverse\nvar proxies []string\nfor i := 0; i &lt; 10; i++ {\n\tproxies = append(proxies,\n\t\tfmt.Sprintf(&quot;http:\u002F\u002Fuser-sid-rot%d:PASSWORD@gate.proxyhat.com:8080&quot;, i))\n}\n\nswitcher, err := proxy.RoundRobinProxySwitcher(proxies...)\nif err != nil {\n\tlog.Fatal(err)\n}\nc.SetProxyFunc(switcher)\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Questo approccio è più semplice ma meno flessibile: non puoi cambiare paese dinamicamente o adattare la rotazione in base alla risposta del server.\u003C\u002Fp>\n\n\u003Ch2>Pattern di produzione: retry, delay, Transport e storage distribuito\u003C\u002Fh2>\n\u003Ch3>Retry con c.Clone()\u003C\u002Fh3>\n\u003Cp>Colly offre \u003Ccode>c.Clone()\u003C\u002Fcode> per creare una copia di un Collector con la stessa configurazione. È utile per isolare i retry in un sub-collector con proxy diversi:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>c.OnError(func(r *colly.Response, err error) {\n\tif r.StatusCode == 403 {\n\t\t\u002F\u002F Clona il collector, cambia sessione proxy, riprova\n\t\tclone := c.Clone()\n\t\tclone.SetProxyFunc(func(req *http.Request) (*url.URL, error) {\n\t\t\tsession := fmt.Sprintf(&quot;retry-%d&quot;, time.Now().UnixNano())\n\t\t\treturn url.Parse(\n\t\t\t\tfmt.Sprintf(&quot;http:\u002F\u002Fuser-sid-%s:PASSWORD@gate.proxyhat.com:8080&quot;, session))\n\t\t})\n\t\tclone.Visit(r.Request.URL.String())\n\t}\n})\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>RandomDelay e Parallelism\u003C\u002Fh3>\n\u003Cp>Il metodo \u003Ccode>Limit()\u003C\u002Fcode> è fondamentale per evitare di saturare il target. Una configurazione equilibrata per scraping residenziale:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Parallelism: 5–10 richieste concorrenti per dominio. Oltre 10, il rischio di CAPTCHA aumenta significativamente.\u003C\u002Fli>\n\u003Cli>Delay: 1 secondo base.\u003C\u002Fli>\n\u003Cli>RandomDelay: 2–3 secondi aggiuntivi. Il random delay è essenziale — pattern di traffico perfettamente regolari sono facilmente rilevabili come bot.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch3>Custom Transport con TLS config\u003C\u002Fh3>\n\u003Cp>Per siti con TLS fingerprinting aggressivo, puoi personalizzare il Transport di Colly:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import (\n\t&quot;crypto\u002Ftls&quot;\n\t&quot;net\u002Fhttp&quot;\n)\n\nc.WithTransport(&amp;http.Transport{\n\tTLSClientConfig: &amp;tls.Config{\n\t\tInsecureSkipVerify: false,\n\t\tMinVersion:         tls.VersionTLS12,\n\t\tMaxVersion:         tls.VersionTLS13,\n\t},\n\tMaxIdleConns:        100,\n\tIdleConnTimeout:    90 * time.Second,\n\tTLSHandshakeTimeout: 10 * time.Second,\n})\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Evita \u003Ccode>InsecureSkipVerify: true\u003C\u002Fcode> in produzione: non risolve il TLS fingerprinting e apre vettori di attacco MITM.\u003C\u002Fp>\n\n\u003Ch3>Storage distribuito con Redis\u003C\u002Fh3>\n\u003Cp>Per scraping distribuito su più istanze (container, VM), Colly supporta backend di storage per condividere lo stato delle visite:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fstorage&quot;\n\n\u002F\u002F Redis backend per deduplicazione cross-istanza\nstorage := &amp;storage.RedisStorage{\n\tAddress:  &quot;redis:\u002F\u002Flocalhost:6379&quot;,\n\tPrefix:  &quot;colly_scraper&quot;,\n}\nc.SetStorage(storage)\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Questo evita di rivisitare URL già processati da altre istanze. Per deployment containerizzato, puoi combinare Redis storage con un orchestratore come Kubernetes per scalare orizzontalmente.\u003C\u002Fp>\n\n\u003Ch2>Confronto: proxy residenziali vs datacenter vs mobile\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Caratteristica\u003C\u002Fth>\u003Cth>Residenziali\u003C\u002Fth>\u003Cth>Datacenter\u003C\u002Fth>\u003Cth>Mobile\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Success rate su target hard\u003C\u002Ftd>\u003Ctd>90–98%\u003C\u002Ftd>\u003Ctd>30–60%\u003C\u002Ftd>\u003Ctd>95–99%\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Latenza media\u003C\u002Ftd>\u003Ctd>200–800ms\u003C\u002Ftd>\u003Ctd>50–200ms\u003C\u002Ftd>\u003Ctd>500–2000ms\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Costo per GB\u003C\u002Ftd>\u003Ctd>Medio\u003C\u002Ftd>\u003Ctd>Basso\u003C\u002Ftd>\u003Ctd>Alto\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Rilevabilità\u003C\u002Ftd>\u003Ctd>Bassa\u003C\u002Ftd>\u003Ctd>Alta\u003C\u002Ftd>\u003Ctd>Minima\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Casi d'uso tipici\u003C\u002Ftd>\u003Ctd>SERP, e-commerce, social\u003C\u002Ftd>\u003Ctd>API pubbliche, testing\u003C\u002Ftd>\u003Ctd>App mobile, geo-restricted\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Per il colly web scraping su target generici, i residenziali offrono il miglior rapporto costo\u002Faffidabilità. I mobile sono superiori per target estremamente protetti ma costano 3–5 volte di più.\u003C\u002Fp>\n\n\u003Ch2>Quando NON usare Colly (e cosa usare al suo posto)\u003C\u002Fh2>\n\u003Cp>Colly è eccellente per HTML statico e API JSON. Non è adatto per:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>SPA JavaScript-heavy: siti che renderizzano tutto con React\u002FVue\u002FAngular. Colly non esegue JS. Per questi casi, usa \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmxschmitt\u002Fplaywright-go\" rel=\"noopener noreferrer\">playwright-go\u003C\u002Fa> o \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fchromedp\u002Fchromedp\" rel=\"noopener noreferrer\">chromedp\u003C\u002Fa>, combinando il browser headless con i proxy di ProxyHat.\u003C\u002Fli>\n\u003Cli>Siti con challenge JS obbligatorie: se il target richiede l'esecuzione di un challenge script prima di servire contenuto, serve un browser vero.\u003C\u002Fli>\n\u003Cli>Streaming dati: Colly è request-response. Per WebSocket o SSE, usa \u003Ccode>gorilla\u002Fwebsocket\u003C\u002Fcode> direttamente.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Una strategia ibrida comune: usa Colly per la fase di discovery (trova gli URL), e un browser headless solo per le pagine che richiedono rendering JS.\u003C\u002Fp>\n\n\u003Ch2>Considerazioni etiche e legali\u003C\u002Fh2>\n\u003Cp>Lo scraping è uno strumento tecnico, ma l'uso che ne fai ha implicazioni legali. Alcuni punti fermi:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Rispetta robots.txt: Colly ha un metodo \u003Ccode>c.IgnoreRobotsTxt = false\u003C\u002Fcode> (default). Non disattivarlo alla leggera.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Non accedere a dati personali\u003C\u002Fstrong> senza base legale (consenso, legittimo interesse). Il GDPR sanziona fino a 20 milioni di euro o il 4% del fatturato globale.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Non sovraccaricare il target\u003C\u002Fstrong>: rate limiting ragionevole è non solo etico, ma tecnicamente vantaggioso — riduce ban e CAPTCHA.\u003C\u002Fli>\n\u003Cli>Verifica i ToS: alcuni siti proibiscono esplicitamente lo scraping nei loro termini. Anche se i dati sono pubblici, violare i ToS può avere conseguenze legali.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>ProxyHat fornisce l'infrastruttura, ma la responsabilità sull'uso è tua. Per approfondire i casi d'uso legittimi, consulta la pagina sulle \u003Ca href=\"\u002Fit\u002Fuse-cases\u002Fweb-scraping\">use case di web scraping\u003C\u002Fa> e sul \u003Ca href=\"\u002Fit\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Configurazione ProxyHat: checklist rapida\u003C\u002Fh2>\n\u003Col>\n\u003Cli>Crea un account su \u003Ca href=\"\u002Fit\u002Fpricing\">ProxyHat\u003C\u002Fa> e ottieni le credenziali.\u003C\u002Fli>\n\u003Cli>Verifica la connettività: \u003Ccode>curl -x http:\u002F\u002Fuser:pass@gate.proxyhat.com:8080 https:\u002F\u002Fhttpbin.org\u002Fip\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Scegli il tipo di proxy: residenziali per target hard, datacenter per API pubbliche.\u003C\u002Fli>\n\u003Cli>Configura lo switcher in Colly con \u003Ccode>SetProxyFunc\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Imposta \u003Ccode>Limit()\u003C\u002Fcode> con parallelismo 5–10 e random delay 2–3s.\u003C\u002Fli>\n\u003Cli>Aggiungi retry su 429\u002F503 con backoff esponenziale.\u003C\u002Fli>\n\u003Cli>Monitora il success rate: se scende sotto l'80%, riduci il parallelismo o cambia pool di paesi.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Per la lista completa delle \u003Ca href=\"\u002Fit\u002Flocations\">locazioni disponibili\u003C\u002Fa> e per la \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentazione tecnica\u003C\u002Fa>, consulta le risorse ufficiali.\u003C\u002Fp>\n\n\u003Ch2>Key Takeaways\u003C\u002Fh2>\n\u003Cblockquote>\n\u003Cp>Punti chiave per i proxy rotanti in Colly:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Usa \u003Ccode>c.SetProxyFunc\u003C\u002Fcode> con una funzione custom per rotazione flessibile — \u003Ccode>RoundRobinProxySwitcher\u003C\u002Fcode> va bene per casi semplici.\u003C\u002Fli>\n\u003Cli>I proxy residenziali sono necessari per target protetti: success rate 90–98% vs 30–60% dei datacenter.\u003C\u002Fli>\n\u003Cli>La rotazione ProxyHat avviene via username: \u003Ccode>user-country-DE-sid-abc123\u003C\u002Fcode> produce un IP unico.\u003C\u002Fli>\n\u003Cli>Limiti di parallelismo (5–10) e random delay (2–3s) sono essenziali per evitare ban.\u003C\u002Fli>\n\u003Cli>Per SPA JS-heavy, Colly non basta — usa playwright-go o chromedp con gli stessi proxy.\u003C\u002Fli>\n\u003Cli>Retry con \u003Ccode>c.Clone()\u003C\u002Fcode> e backoff esponenziale su 429\u002F503. Storage Redis per scraping distribuito.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>\n\n\u003Ch2>FAQ\u003C\u002Fh2>\n\u003Ch3>Perché i proxy rotanti in Colly sono importanti?\u003C\u002Fh3>\n\u003Cp>I proxy rotanti sono importanti perché permettono di superare i limiti di frequenza imposti dai siti target. Un singolo IP che invia centinaia di richieste viene bloccato rapidamente — spesso dopo 100–200 richieste su endpoint protetti. Distribuendo il traffico su più IP residenziali, ogni richiesta appare come proveniente da un utente diverso, mantenendo un success rate del 90–98% anche su target difficili come SERP o e-commerce protetti.\u003C\u002Fp>\n\n\u003Ch3>Quale tipo di proxy funziona meglio in Colly?\u003C\u002Fh3>\n\u003Cp>I proxy residenziali sono la scelta migliore per la maggior parte dei casi d'uso di scraping con Colly. Offrono un success rate del 90–98% sui target hard, contro il 30–60% dei datacenter, perché usano IP assegnati a dispositivi reali tramite ISP. I proxy mobile sono ancora più difficili da rilevare (95–99%) ma costano 3–5 volte di più. I datacenter sono adatti solo per API pubbliche e testing, dove il blocco IP non è un problema.\u003C\u002Fp>\n\n\u003Ch3>Come evitare i blocchi con i proxy rotanti in Colly?\u003C\u002Fh3>\n\u003Cp>Per evitare blocchi: imposta \u003Ccode>Limit()\u003C\u002Fcode> con parallelismo 5–10 richieste concorrenti e random delay di 2–3 secondi; usa proxy residenziali con rotazione per-request (sessione unica nello username); implementa retry con backoff esponenziale su HTTP 429 e 503 usando \u003Ccode>c.Clone()\u003C\u002Fcode>; configura un User-Agent realistico; e rispetta il file \u003Ccode>robots.txt\u003C\u002Fcode>. Se il success rate scende sotto l'80%, riduci il parallelismo o amplia il pool di paesi.\u003C\u002Fp>\n\n\u003Ch3>Colly supporta SOCKS5 per i proxy rotanti?\u003C\u002Fh3>\n\u003Cp>Sì, Colly supporta SOCKS5 attraverso il formato \u003Ccode>socks5:\u002F\u002F\u003C\u002Fcode> nell'URL del proxy. Con ProxyHat, puoi usare \u003Ccode>socks5:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:1080\u003C\u002Fcode> nella funzione passata a \u003Ccode>SetProxyFunc\u003C\u002Fcode>. SOCKS5 è utile quando il target blocca il traffico HTTP CONNECT o quando hai bisogno di tunneling TCP completo. La rotazione funziona identicamente: basta cambiare il parametro session nello username.\u003C\u002Fp>\n\u003C\u002Fblockquote>","Proxy Rotanti in Colly: Guida Go | ProxyHat","Guida pratica per proxy rotanti in Colly: SetProxyFunc, RoundRobinProxySwitcher, sessioni sticky, geo-targeting e pattern di produzione per Go developer.","\u002Fit\u002Fblog\u002Fproxy-rotanti-in-colly-guida",null,"https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fproxy-rotanti-in-colly-guida-og.webp",[17,20,23,26],{"question":18,"answer":19},"Perché i proxy rotanti in Colly sono importanti?","I proxy rotanti sono importanti perché permettono di superare i limiti di frequenza imposti dai siti target. Un singolo IP che invia centinaia di richieste viene bloccato rapidamente — spesso dopo 100–200 richieste su endpoint protetti. Distribuendo il traffico su più IP residenziali, ogni richiesta appare come proveniente da un utente diverso, mantenendo un success rate del 90–98% anche su target difficili come SERP o e-commerce protetti.",{"question":21,"answer":22},"Quale tipo di proxy funziona meglio in Colly?","I proxy residenziali sono la scelta migliore per la maggior parte dei casi d'uso di scraping con Colly. Offrono un success rate del 90–98% sui target hard, contro il 30–60% dei datacenter, perché usano IP assegnati a dispositivi reali tramite ISP. I proxy mobile sono ancora più difficili da rilevare (95–99%) ma costano 3–5 volte di più. I datacenter sono adatti solo per API pubbliche e testing, dove il blocco IP non è un problema.",{"question":24,"answer":25},"Come evitare i blocchi con i proxy rotanti in Colly?","Per evitare blocchi: imposta Limit() con parallelismo 5–10 richieste concorrenti e random delay di 2–3 secondi; usa proxy residenziali con rotazione per-request (sessione unica nello username); implementa retry con backoff esponenziale su HTTP 429 e 503 usando c.Clone(); configura un User-Agent realistico; e rispetta il file robots.txt. Se il success rate scende sotto l'80%, riduci il parallelismo o amplia il pool di paesi.",{"question":27,"answer":28},"Colly supporta SOCKS5 per i proxy rotanti?","Sì, Colly supporta SOCKS5 attraverso il formato socks5:\u002F\u002F nell'URL del proxy. Con ProxyHat, puoi usare socks5:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:1080 nella funzione passata a SetProxyFunc. SOCKS5 è utile quando il target blocca il traffico HTTP CONNECT o quando hai bisogno di tunneling TCP completo. La rotazione funziona identicamente: basta cambiare il parametro session nello username.",false,"2026-08-04T10:05:34+00:00","2026-10-03T08:29:56+00:00","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",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.",[],{"es":49,"ru":50,"ja":51,"pt":52,"pl":53,"ko":54,"tr":55,"zh":56,"it":13,"de":57,"en":58,"fr":59,"x-default":58},"\u002Fes\u002Fblog\u002Frotacion-proxies-colly-golang-1","\u002Fru\u002Fblog\u002Frotaciya-proksi-v-colly-1","\u002Fja\u002Fblog\u002Fcolly-purokushi-roteshon-gaido","\u002Fpt\u002Fblog\u002Fproxies-rotativos-em-colly","\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","\u002Fde\u002Fblog\u002Frotierende-proxies-in-colly","\u002Fblog\u002Frotating-proxies-in-colly-golang","\u002Ffr\u002Fblog\u002Frotation-proxies-colly-golang-1",{"es":49,"ru":50,"ja":51,"pt":52,"pl":53,"ko":54,"tr":55,"zh":56,"it":13,"de":57,"en":58,"fr":59},71,[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":4,"views":90,"author":91,"categories":92,"tags":94},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},[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":29,"views":106,"author":107,"categories":108,"tags":110},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.","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","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscraping-binance-rest-api-con-proxy-og.webp","2026-08-03T10:04:04+00:00","2026-10-03T08:29:51+00:00",82,{"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",234,{"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},[],[]]