[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-fr-rotation-proxies-colly-golang-1":3},{"success":4,"payload":5,"related":60,"errors":125},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":27,"noindex_google_only":27,"allow_follow":4,"published_at":28,"updated_at":28,"content_updated_at":29,"featured_image_url":30,"featured_image_alt":31,"card_image_url":32,"reading_time_minutes":33,"author":34,"categories":38,"tags":45,"alternates":46,"locale_paths":58,"views":59},175,"rotation-proxies-colly-golang-1","Rotation de proxies dans Colly : guide complet pour le web scraping en Go","Apprenez à implémenter une rotation de proxies dans Colly avec des proxies résidentiels ProxyHat. Couvre proxy.RoundRobinProxySwitcher, SetProxyFunc, sessions collantes, et patterns de production pour le scraping à grande échelle.","\u003Cp>La rotation de proxies dans Colly est la technique la plus efficace pour maintenir un throughput élevé lors du web scraping en Go sans se faire bloquer. Colly, le framework de scraping le plus populaire en Go, expose des points d'extension idiomatiques — notamment \u003Ccode>proxy.RoundRobinProxySwitcher\u003C\u002Fcode> et \u003Ccode>c.SetProxyFunc\u003C\u002Fcode> — qui s'intègrent naturellement dans son modèle de collecteur asynchrone. Ce guide vous montre comment configurer une rotation de proxies résidentiels via ProxyHat, gérer les sessions collantes par pays\u002Fville, et déployer un scraper de production robuste.\u003C\u002Fp>\n\n\u003Cblockquote>\u003Cstrong>Note légale :\u003C\u002Fstrong> Le scraping de données publiques doit respecter le \u003Ccode>robots.txt\u003C\u002Fcode>, les conditions d'utilisation des sites, et les réglementations comme le \u003Ca href=\"https:\u002F\u002Fgdpr-info.eu\u002F\" rel=\"noopener noreferrer\">RGPD\u003C\u002Fa> en Europe et le CFAA aux États-Unis. Ce guide couvre des techniques techniques, pas des conseils juridiques.\u003C\u002Fp>\u003C\u002Fblockquote>\n\n\u003Ch2>Pourquoi la rotation de proxies dans Colly est indispensable\u003C\u002Fh2>\n\n\u003Cp>Colly est construit autour d'un modèle de \u003Cstrong>Collector\u003C\u002Fstrong> qui émet des requêtes HTTP asynchrones via un pool de goroutines. Chaque requête traverse une chaîne de callbacks : \u003Ccode>OnRequest\u003C\u002Fcode>, \u003Ccode>OnResponse\u003C\u002Fcode>, \u003Ccode>OnHTML\u003C\u002Fcode>, \u003Ccode>OnError\u003C\u002Fcode>. Le framework repose sur \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgocolly\u002Fcolly\" rel=\"noopener noreferrer\">goquery\u003C\u002Fa> pour la traversée du DOM, ce qui permet de sélectionner des éléments avec une syntaxe proche de jQuery.\u003C\u002Fp>\n\n\u003Cp>Le problème : la plupart des sites modernes détectent les patterns de scraping en surveillant le volume de requêtes par adresse IP. Un scraper Colly sans rotation peut envoyer des centaines de requêtes par seconde depuis une seule IP. Les systèmes anti-bot comme Cloudflare, DataDome, ou PerimeterX bloquent généralement une IP après \u003Cstrong>50 à 200 requêtes\u003C\u002Fstrong> dans un court intervalle. La rotation de proxies distribue ces requêtes sur des centaines ou milliers d'adresses IP, réduisant la charge par IP à un niveau indétectable.\u003C\u002Fp>\n\n\u003Cp>Les proxies résidenti sont particulièrement efficaces car ils utilisent des adresses IP attribuées par des FAI réels (Orange, Comcast, Deutsche Telekom), ce qui les rend indiscernables du trafic humain normal. Les proxies datacenter, en revanche, sont souvent déjà flaggés par les listes de réputation IP.\u003C\u002Fp>\n\n\u003Ch3>Anatomie d'un Collector Colly\u003C\u002Fh3>\n\n\u003Cp>Avant de plonger dans la rotation, rappelons les composants clés du Collector Colly que nous allons exploiter :\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>OnRequest(func(*colly.Request))\u003C\u002Fcode>\u003C\u002Fstrong> — intercepte chaque requête avant l'envoi. Idéal pour injecter des headers personnalisés.\u003C\u002Fli>\n\u003Cli>\u003Ccode>OnHTML(selector, func(*colly.HTMLElement))\u003C\u002Fcode> — callback déclenché quand un sélecteur CSS matche dans la réponse.\u003C\u002Fli>\n\u003Cli>\u003Ccode>OnError(func(*colly.Response, error))\u003C\u002Fcode> — gère les erreurs HTTP et réseau, crucial pour les retries.\u003C\u002Fli>\n\u003Cli>\u003Ccode>c.Async = true\u003C\u002Fcode> — active le mode asynchrone avec goroutines.\u003C\u002Fli>\n\u003Cli>\u003Ccode>c.Limit(&colly.LimitRule{...})\u003C\u002Fcode> — contrôle le taux de requêtes par domaine.\u003C\u002Fli>\n\u003Cli>\u003Ccode>c.SetProxyFunc(func(*http.Request) (*url.URL, error))\u003C\u002Fcode> — fonction appelée pour chaque requête pour déterminer le proxy à utiliser.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Proxy rotation idiomatique : RoundRobinProxySwitcher et SetProxyFunc\u003C\u002Fh2>\n\n\u003Cp>Colly fournit un package \u003Ccode>proxy\u003C\u002Fcode> avec un \u003Ccode>RoundRobinProxySwitcher\u003C\u002Fcode> prêt à l'emploi. Cette fonction retourne une \u003Ccode>colly.ProxyFunc\u003C\u002Fcode> qui alterne entre une liste de proxies de manière circulaire. C'est le point d'entrée le plus simple pour la rotation.\u003C\u002Fp>\n\n\u003Ch3>Exemple 1 : RoundRobinProxySwitcher basique avec ProxyHat\u003C\u002Fh3>\n\n\u003Cpre>\u003Ccode>package main\n\nimport (\n    &quot;fmt&quot;\n    &quot;log&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fproxy&quot;\n)\n\nfunc main() {\n    c := colly.NewCollector(\n        colly.Async(true),\n    )\n\n    \u002F\u002F Liste de proxies ProxyHat avec sessions différentes\n    proxies := []string{\n        &quot;http:\u002F\u002Fuser-sid-sess1:pass@gate.proxyhat.com:8080&quot;,\n        &quot;http:\u002F\u002Fuser-sid-sess2:pass@gate.proxyhat.com:8080&quot;,\n        &quot;http:\u002F\u002Fuser-sid-sess3:pass@gate.proxyhat.com:8080&quot;,\n        &quot;http:\u002F\u002Fuser-sid-sess4:pass@gate.proxyhat.com:8080&quot;,\n        &quot;http:\u002F\u002Fuser-sid-sess5:pass@gate.proxyhat.com:8080&quot;,\n    }\n\n    rp, err := proxy.RoundRobinProxySwitcher(proxies...)\n    if err != nil {\n        log.Fatal(err)\n    }\n    c.SetProxyFunc(rp)\n\n    c.OnHTML(&quot;title&quot;, func(e *colly.HTMLElement) {\n        fmt.Println(&quot;Titre:&quot;, e.Text)\n    })\n\n    c.OnError(func(r *colly.Response, err error) {\n        fmt.Printf(&quot;Erreur sur %s: %v\\n&quot;, r.Request.URL, err)\n    })\n\n    c.Limit(&amp;colly.LimitRule{\n        DomainGlob:  &quot;*&quot;,\n        Parallelism: 5,\n        Delay:       2 * time.Second,\n    })\n\n    c.Visit(&quot;https:\u002F\u002Fhttpbin.org\u002Fip&quot;)\n    c.Wait()\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Dans cet exemple, chaque requête utilise une session ProxyHat différente (\u003Ccode>sess1\u003C\u002Fcode> à \u003Ccode>sess5\u003C\u002Fcode>), ce qui force le changement d'IP à chaque requête. Le \u003Ccode>LimitRule\u003C\u002Fcode> avec \u003Ccode>Parallelism: 5\u003C\u002Fcode> et un délai de 2 secondes évite de saturer les cibles.\u003C\u002Fp>\n\n\u003Ch3>Géociblage et sessions collantes\u003C\u002Fh3>\n\n\u003Cp>ProxyHat permet de contrôler la géolocalisation et la persistance d'IP via le nom d'utilisateur. Pour un scraping ciblé sur l'Allemagne :\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>\u002F\u002F Proxy résidentiel à Berlin\nproxy := &quot;http:\u002F\u002Fuser-country-DE-region-state_of_berlin-city-berlin-sid-abc123:pass@gate.proxyhat.com:8080&quot;\n\n\u002F\u002F Proxy résidentiel à Munich\nproxy2 := &quot;http:\u002F\u002Fuser-country-DE-region-bayern-city-munich-sid-def456:pass@gate.proxyhat.com:8080&quot;\n\n\u002F\u002F Proxy mobile au Royaume-Uni\nproxy3 := &quot;http:\u002F\u002Fuser-country-GB-sid-ghi789:pass@gate.proxyhat.com:8080&quot;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Le flag \u003Ccode>-sid-abc123\u003C\u002Fcode> garantit que toutes les requêtes utilisant cette session sortiront par la même IP résidentielle jusqu'à expiration. C'est essentiel pour les sites qui nécessitent une continuité de session (paniers, authentification, pagination stateful).\u003C\u002Fp>\n\n\u003Ch2>Proxy switcher personnalisé : contrôle total par requête\u003C\u002Fh2>\n\n\u003Cp>Le \u003Ccode>RoundRobinProxySwitcher\u003C\u002Fcode> est pratique mais limité. Pour un contrôle fin — par exemple, alterner les pays, gérer un pool dynamique d'IP, ou marquer les proxies défaillants — il faut implémenter une \u003Ccode>ProxyFunc\u003C\u002Fcode> personnalisée.\u003C\u002Fp>\n\n\u003Ch3>Exemple 2 : Proxy switcher personnalisé avec géorotation\u003C\u002Fh3>\n\n\u003Cpre>\u003Ccode>package main\n\nimport (\n    &quot;fmt&quot;\n    &quot;math\u002Frand&quot;\n    &quot;net\u002Fhttp&quot;\n    &quot;net\u002Furl&quot;\n    &quot;sync&quot;\n    &quot;time&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n)\n\ntype ProxyRotator struct {\n    mu      sync.Mutex\n    counter int\n    countries []string\n    baseUser  string\n    password string\n}\n\nfunc (pr *ProxyRotator) NextProxy(req *http.Request) (*url.URL, error) {\n    pr.mu.Lock()\n    defer pr.mu.Unlock()\n\n    country := pr.countries[pr.counter % len(pr.countries)]\n    sessionID := fmt.Sprintf(&quot;sess-%d-%d&quot;, time.Now().Unix(), rand.Intn(9999))\n    pr.counter++\n\n    proxyURL := fmt.Sprintf(&quot;http:\u002F\u002F%s-country-%s-sid-%s:%s@gate.proxyhat.com:8080&quot;,\n        pr.baseUser, country, sessionID, pr.password)\n\n    return url.Parse(proxyURL)\n}\n\nfunc main() {\n    c := colly.NewCollector(colly.Async(true))\n\n    rotator := &amp;ProxyRotator{\n        countries: []string{&quot;DE&quot;, &quot;FR&quot;, &quot;GB&quot;, &quot;US&quot;, &quot;ES&quot;},\n        baseUser:  &quot;user&quot;,\n        password:  &quot;pass&quot;,\n    }\n\n    c.SetProxyFunc(rotator.NextProxy)\n\n    c.OnHTML(&quot;title&quot;, func(e *colly.HTMLElement) {\n        fmt.Printf(&quot;[%s] %s\\n&quot;, e.Request.AbsoluteURL(e.Request.URL.String()), e.Text)\n    })\n\n    c.OnError(func(r *colly.Response, err error) {\n        fmt.Printf(&quot;Erreur: %v (status: %d)\\n&quot;, err, r.StatusCode)\n    })\n\n    c.Limit(&amp;colly.LimitRule{\n        DomainGlob:  &quot;*&quot;,\n        Parallelism: 10,\n        Delay:       500 * time.Millisecond,\n    })\n\n    for i := 0; i &lt; 50; i++ {\n        c.Visit(&quot;https:\u002F\u002Fhttpbin.org\u002Fip&quot;)\n    }\n    c.Wait()\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Ce switcher génère un identifiant de session unique à chaque appel, ce qui force ProxyHat à attribuer une nouvelle IP résidentielle dans un pays différent à chaque requête. Le mutex protège le compteur contre les accès concurrents puisque Colly exécute les callbacks en parallèle.\u003C\u002Fp>\n\n\u003Ch2>Support SOCKS5 et configuration TLS avancée\u003C\u002Fh2>\n\n\u003Cp>ProxyHat supporte également SOCKS5 sur le port \u003Ccode>1080\u003C\u002Fcode>. SOCKS5 peut être préférable pour le scraping car il opère au niveau TCP et supporte n'importe quel protocole au-dessus. Pour utiliser SOCKS5 dans Colly :\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import (\n    &quot;crypto\u002Ftls&quot;\n    &quot;net\u002Fhttp&quot;\n    &quot;net\u002Furl&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n)\n\nfunc main() {\n    c := colly.NewCollector()\n\n    \u002F\u002F Proxy SOCKS5 ProxyHat\n    proxyURL, _ := url.Parse(&quot;socks5:\u002F\u002Fuser-country-DE-sid-sock1:pass@gate.proxyhat.com:1080&quot;)\n\n    c.SetProxyFunc(func(req *http.Request) (*url.URL, error) {\n        return proxyURL, nil\n    })\n\n    \u002F\u002F Configuration TLS pour éviter les erreurs de certificat\n    c.WithTransport(&amp;http.Transport{\n        Proxy: http.ProxyURL(proxyURL),\n        TLSClientConfig: &amp;tls.Config{\n            InsecureSkipVerify: false,\n            MinVersion:         tls.VersionTLS12,\n        },\n    })\n\n    c.Visit(&quot;https:\u002F\u002Fhttpbin.org\u002Fip&quot;)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Notez que \u003Ccode>InsecureSkipVerify: false\u003C\u002Fcode> est volontaire — en production, la validation TLS est essentielle pour la sécurité. Ne la désactivez que pour le débogage.\u003C\u002Fp>\n\n\u003Ch2>Patterns de production : retries, clonage, et scaling\u003C\u002Fh2>\n\n\u003Ch3>Retries avec c.Clone()\u003C\u002Fh3>\n\n\u003Cp>Colly permet de cloner un Collector avec \u003Ccode>c.Clone()\u003C\u002Fcode>. Le clone hérite de la configuration mais peut avoir son propre proxy et ses propres callbacks. C'est idéal pour implémenter un retry avec un proxy différent :\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>func retryWithNewProxy(c *colly.Collector, url string, maxRetries int) {\n    var attempt func(n int)\n    attempt = func(n int) {\n        if n &gt;= maxRetries {\n            log.Printf(&quot;Échec après %d tentatives: %s&quot;, maxRetries, url)\n            return\n        }\n\n        clone := c.Clone()\n        sessionID := fmt.Sprintf(&quot;retry-%d-%d&quot;, n, time.Now().UnixNano())\n        proxyStr := fmt.Sprintf(&quot;http:\u002F\u002Fuser-sid-%s:pass@gate.proxyhat.com:8080&quot;, sessionID)\n\n        proxyURL, _ := url.Parse(proxyStr)\n        clone.SetProxyFunc(func(req *http.Request) (*url.URL, error) {\n            return proxyURL, nil\n        })\n\n        clone.OnError(func(r *colly.Response, err error) {\n            if r.StatusCode == 403 || r.StatusCode == 429 {\n                time.Sleep(time.Duration(n+1) * 2 * time.Second) \u002F\u002F backoff exponentiel\n                attempt(n + 1)\n            }\n        })\n\n        clone.OnHTML(&quot;title&quot;, func(e *colly.HTMLElement) {\n            fmt.Println(&quot;Succès après&quot;, n, &quot;tentative(s):&quot;, e.Text)\n        })\n\n        clone.Visit(url)\n        clone.Wait()\n    }\n    attempt(0)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>Limites de parallélisme et délais aléatoires\u003C\u002Fh3>\n\n\u003Cp>Le \u003Ccode>LimitRule\u003C\u002Fcode> de Colly est votre première ligne de défense contre la détection :\u003C\u002Fp>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Paramètre\u003C\u002Fth>\n\u003Cth>Valeur recommandée\u003C\u002Fth>\n\u003Cth>Effet\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Parallelism\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>5–20\u003C\u002Ftd>\n\u003Ctd>Nombre de requêtes simultanées par domaine\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Delay\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>1–3s\u003C\u002Ftd>\n\u003Ctd>Délai fixe entre requêtes vers le même domaine\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>RandomDelay\u003C\u002Fcode>\u003C\u002Ftd>\td>0.5–2s\u003C\u002Ftd>\n\u003Ctd>Jitter aléatoire ajouté au délai, imite le comportement humain\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>Un \u003Ccode>RandomDelay\u003C\u002Fcode> de 1 seconde avec un \u003Ccode>Parallelism\u003C\u002Fcode> de 10 et 100 proxies en rotation donne un throughput d'environ 10 requêtes\u002Fseconde par domaine — suffisant pour la plupart des cas d'usage sans déclencher de protections.\u003C\u002Fp>\n\n\u003Ch3>Stockage distribué avec Redis\u003C\u002Fh3>\n\n\u003Cp>Pour un scraping distribué sur plusieurs instances, Colly supporte des backends de stockage comme Redis pour partager les cookies et l'état des URLs visitées :\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import (\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fstorage&quot;\n    &quot;github.com\u002Fgocolly\u002Fredisstorage&quot;\n)\n\nfunc main() {\n    c := colly.NewCollector()\n\n    storage := &amp;redisstorage.Storage{\n        Address:  &quot;redis:\u002F\u002Flocalhost:6379&quot;,\n        Prefix:   &quot;colly_scraper&quot;,\n    }\n\n    c.SetStorage(storage)\n\n    \u002F\u002F Les URLs visitées et les cookies sont maintenant partagés\n    \u002F\u002F entre toutes les instances connectées au même Redis\n    c.Visit(&quot;https:\u002F\u002Fexample.com&quot;)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Ce pattern permet de déployer plusieurs conteneurs Docker, chacun exécutant un Collector Colly, tous connectés au même Redis. La déduplication des URLs et la distribution de charge sont gérées automatiquement.\u003C\u002Fp>\n\n\u003Ch2>Erreurs courantes et cas limites\u003C\u002Fh2>\n\n\u003Ch3>1. Oublier c.Wait() en mode Async\u003C\u002Fh3>\n\u003Cp>En mode \u003Ccode>Async(true)\u003C\u002Fcode>, \u003Ccode>c.Visit()\u003C\u002Fcode> retourne immédiatement. Sans \u003Ccode>c.Wait()\u003C\u002Fcode>, le programme principal se termine avant que les goroutines aient terminé. C'est l'erreur la plus fréquente chez les débutants Colly.\u003C\u002Fp>\n\n\u003Ch3>2. Ne pas gérer les erreurs 429 et 403\u003C\u002Fh3>\n\u003Cp>Un code 429 (Too Many Requests) ou 403 (Forbidden) signifie que l'IP actuelle est flaggée. Le bon réflexe : changer de session proxy et réessayer après un backoff, pas insister avec la même IP.\u003C\u002Fp>\n\n\u003Ch3>3. Surcharger les LimitRules\u003C\u002Fh3>\n\u003Cp>Un \u003Ccode>Parallelism\u003C\u002Fcode> trop élevé (50+) sans rotation de proxies suffisante va déclencher des blocages IP. La règle empirique : 1 proxy session active par requête parallèle, avec une marge de 20%.\u003C\u002Fp>\n\n\u003Ch3>4. Ignorer le type de contenu\u003C\u002Fh3>\n\u003Cp>Colly est conçu pour le HTML. Pour les APIs JSON, utilisez \u003Ccode>OnResponse\u003C\u002Fcode> au lieu de \u003Ccode>OnHTML\u003C\u002Fcode>. Pour les SPAs JavaScript (React, Vue, Angular), Colly ne suffira pas — il faut un navigateur headless comme \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmxschmitt\u002Fplaywright-go\" rel=\"noopener noreferrer\">playwright-go\u003C\u002Fa> ou Rod.\u003C\u002Fp>\n\n\u003Ch2>Quand ne PAS utiliser Colly\u003C\u002Fh2>\n\n\u003Cp>Colly excelle pour le scraping de pages HTML statiques ou rendues côté serveur. Il atteint ses limites quand :\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>Le site est une SPA nécessitant l'exécution de JavaScript (React, Vue, Angular).\u003C\u002Fli>\n\u003Cli>Le contenu est chargé via WebSocket ou Server-Sent Events.\u003C\u002Fli>\n\u003Cli>Le site utilise des challenges CAPTCHA interactifs (hCaptcha, reCAPTCHA v3).\u003C\u002Fli>\n\u003Cli>Le rendu nécessite une interaction utilisateur complexe (scroll infini, clics multiples).\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Dans ces cas, combinez Colly avec un navigateur headless : utilisez Colly pour l'orchestration et la rotation de proxies, et déléguez le rendu à Playwright ou Chromium. Vous pouvez injecter le proxy ProxyHat directement dans la configuration du navigateur.\u003C\u002Fp>\n\n\u003Ch2>Configuration ProxyHat : checklist de production\u003C\u002Fh2>\n\n\u003Cp>Pour un déploiement en production avec ProxyHat et Colly, voici la configuration recommandée :\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>Endpoint HTTP : \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode> — utilisez ce port pour le trafic HTTP\u002FHTTPS.\u003C\u002Fli>\n\u003Cli>Endpoint SOCKS5 : \u003Ccode>gate.proxyhat.com:1080\u003C\u002Fcode> — préférez SOCKS5 pour les connexions non-HTTP.\u003C\u002Fli>\n\u003Cli>Rotation par requête : utilisez un \u003Ccode>sid-ID\u003C\u002Fcode> unique à chaque requête pour forcer le changement d'IP.\u003C\u002Fli>\n\u003Cli>Géociblage : ajoutez \u003Ccode>-country-XX\u003C\u002Fcode> et optionnellement \u003Ccode>-region-region-city-ville\u003C\u002Fcode> dans le nom d'utilisateur.\u003C\u002Fli>\n\u003Cli>Pool de sessions : préparez au moins 50 sessions différentes pour un throughput de 10 req\u002Fs.\u003C\u002Fli>\n\u003Cli>Monitoring : logguez le \u003Ccode>StatusCode\u003C\u002Fcode> et l'IP de sortie pour détecter les dégradations.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Consultez la \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentation ProxyHat\u003C\u002Fa> pour la liste complète des paramètres de géociblage et les limites de concurrency par plan. Pour comparer les types de proxies disponibles, visitez notre \u003Ca href=\"\u002Ffr\u002Fpricing\">page de tarification\u003C\u002Fa>. Pour voir la couverture géographique, consultez nos \u003Ca href=\"\u002Ffr\u002Flocations\">localisations proxy\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Key Takeaways\u003C\u002Fh2>\n\n\u003Cblockquote>\n\u003Cul>\n\u003Cli>RoundRobinProxySwitcher est le point d'entrée le plus simple pour la rotation de proxies dans Colly, mais une \u003Ccode>ProxyFunc\u003C\u002Fcode> personnalisée offre un contrôle total sur la géolocalisation et les sessions.\u003C\u002Fli>\n\u003Cli>Sessions collantes via \u003Ccode>-sid-abc123\u003C\u002Fcode> garantissent une IP constante pour les flux nécessitant une continuité (pagination, auth, panier).\u003C\u002Fli>\n\u003Cli>Géorotation avec \u003Ccode>-country-DE-region-state_of_berlin-city-berlin\u003C\u002Fcode> permet de cibler des marchés spécifiques et d'éviter les blocages géographiques.\u003C\u002Fli>\n\u003Cli>LimitRules avec \u003Ccode>Parallelism\u003C\u002Fcode> et \u003Ccode>RandomDelay\u003C\u002Fcode> sont aussi importants que la rotation elle-même — un bon scraper combine les deux.\u003C\u002Fli>\n\u003Cli>Retries avec c.Clone() permettent de changer de proxy à chaque tentative, maximisant les chances de succès sur les cibles difficiles.\u003C\u002Fli>\n\u003Cli>Redis storage permet un scraping distribué multi-instances avec déduplication automatique des URLs.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Colly ne suffit pas\u003C\u002Fstrong> pour les SPAs JavaScript — combinez-le avec un navigateur headless si nécessaire.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>\n\n\u003Cp>Prêt à industrialiser votre scraping ? Découvrez comment ProxyHat peut améliorer vos projets de \u003Ca href=\"\u002Ffr\u002Fuse-cases\u002Fweb-scraping\">web scraping\u003C\u002Fa> et de \u003Ca href=\"\u002Ffr\u002Fuse-cases\u002Fserp-tracking\">suivi SERP\u003C\u002Fa> avec des proxies résidentiels à rotation automatique.\u003C\u002Fp>","Rotation de proxies dans Colly : guide Go | ProxyHat","Guide complet pour la rotation de proxies dans Colly avec Go. Code runnable, proxy switcher, sessions résidentielles ProxyHat, et patterns de production pour le scraping à grande échelle.","\u002Ffr\u002Fblog\u002Frotation-proxies-colly-golang-1",null,"Guide complet pour la rotation de proxies dans Colly avec Go. Code runnable, proxy switcher, sessions résidentielles ProxyHat, et patterns de production.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Frotation-proxies-colly-golang-1-og.webp",[18,21,24],{"question":19,"answer":20},"Pourquoi la rotation de proxies dans Colly est-elle importante ?","Sans rotation de proxies, toutes les requêtes d'un scraper Colly sortent par la même IP. Les systèmes anti-bot modernes bloquent une IP après 50 à 200 requêtes rapprochées. La rotation distribue le trafic sur des centaines d'IP résidentielles, réduisant la charge par IP à un niveau indétectable et maintenant un throughput élevé sans interruptions.",{"question":22,"answer":23},"Quel type de proxy fonctionne le mieux pour la rotation dans Colly ?","Les proxies résidentiels sont le meilleur choix pour la rotation dans Colly car ils utilisent des adresses IP attribuées par des FAI réels, ce qui les rend indiscernables du trafic humain. Les proxies datacenter sont souvent flaggés par les listes de réputation IP. Les proxies mobiles offrent le plus haut niveau de confiance mais à un coût plus élevé. ProxyHat propose les trois types sur le endpoint gate.proxyhat.com:8080.",{"question":25,"answer":26},"Comment éviter les blocages lors de la rotation de proxies dans Colly ?","Pour éviter les blocages : combinez la rotation de proxies avec des LimitRules (Parallelism de 5-20, RandomDelay de 0.5-2s), utilisez des sessions uniques par requête pour forcer le changement d'IP, implémentez des retries avec c.Clone() et backoff exponentiel sur les codes 429\u002F403, et utilisez des proxies résidentiels avec géociblage pour correspondre au trafic légitime de la région cible.",false,"2026-08-04T10:05:34+00:00","2026-10-03T23:53:00+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Frotation-proxies-colly-golang-1-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Frotation-proxies-colly-golang-1-card.webp",12,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[39],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},4,"guides-developpeurs","Guides Développeurs","Guides Développeurs | Blog ProxyHat","Tutoriels de code et guides SDK pour intégrer des proxies dans vos applications.",[],{"es":47,"ru":48,"ja":49,"pt":50,"pl":51,"ko":52,"tr":53,"zh":54,"it":55,"de":56,"en":57,"fr":13,"x-default":57},"\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","\u002Fit\u002Fblog\u002Fproxy-rotanti-in-colly-guida","\u002Fde\u002Fblog\u002Frotierende-proxies-in-colly","\u002Fblog\u002Frotating-proxies-in-colly-golang",{"es":47,"ru":48,"ja":49,"pt":50,"pl":51,"ko":52,"tr":53,"zh":54,"it":55,"de":56,"en":57,"fr":13},71,[61,77,93,109],{"id":62,"slug":63,"title":64,"excerpt":65,"featured_image_url":66,"featured_image_alt":67,"card_image_url":68,"og_image_url":69,"published_at":70,"updated_at":70,"content_updated_at":71,"reading_time_minutes":33,"is_featured":27,"indexable":4,"views":72,"author":73,"categories":74,"tags":76},176,"got-scraping-nodejs-proxy-residentiel-1","Guide got-scraping avec Node.js : proxies résidentiels et header generator","Apprenez à utiliser got-scraping avec Node.js pour des requêtes HTTP qui ressemblent à un vrai navigateur, avec rotation de proxies résidentiels ProxyHat, hooks de retry et patterns de production.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fgot-scraping-nodejs-proxy-residentiel-1-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fgot-scraping-nodejs-proxy-residentiel-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fgot-scraping-nodejs-proxy-residentiel-1-og.webp","2026-08-04T16:05:06+00:00","2026-10-03T08:29:58+00:00",121,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},[75],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},[],{"id":78,"slug":79,"title":80,"excerpt":81,"featured_image_url":82,"featured_image_alt":83,"card_image_url":84,"og_image_url":85,"published_at":86,"updated_at":86,"content_updated_at":87,"reading_time_minutes":33,"is_featured":27,"indexable":4,"views":88,"author":89,"categories":90,"tags":92},195,"scraper-api-bybit-v5-proxys-rotatifs","Collecter des données de marché crypto avec des proxys rotatifs : rate limits, géoblocages et pagination (exemple Bybit V5)","Guide développeur pour scraper les endpoints \u002Fv5\u002Fmarket\u002F de Bybit avec proxys rotatifs : orderbook, tickers, kline. Code Node.js et Python, gestion des rate limits et sessions sticky.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fscraper-api-bybit-v5-proxys-rotatifs-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fscraper-api-bybit-v5-proxys-rotatifs-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fscraper-api-bybit-v5-proxys-rotatifs-og.webp","2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00",87,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},[91],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},[],{"id":94,"slug":95,"title":96,"excerpt":97,"featured_image_url":98,"featured_image_alt":99,"card_image_url":100,"og_image_url":101,"published_at":102,"updated_at":102,"content_updated_at":103,"reading_time_minutes":33,"is_featured":27,"indexable":4,"views":104,"author":105,"categories":106,"tags":108},194,"comment-scraper-api-rest-binance-proxies","Limites de poids des API d'exchanges crypto : collecter les données de marché avec des proxies (exemple Binance)","Guide pratique pour collecter les données de marché publiques de Binance via son API REST à grande échelle en utilisant des proxies rotatifs. Endpoints, poids, rate limiting, code Python et Node.js inclus.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fcomment-scraper-api-rest-binance-proxies-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fcomment-scraper-api-rest-binance-proxies-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fcomment-scraper-api-rest-binance-proxies-og.webp","2026-08-03T10:04:04+00:00","2026-10-04T01:29:50+00:00",82,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},[107],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},[],{"id":110,"slug":111,"title":112,"excerpt":113,"featured_image_url":114,"featured_image_alt":115,"card_image_url":116,"og_image_url":117,"published_at":118,"updated_at":118,"content_updated_at":119,"reading_time_minutes":33,"is_featured":27,"indexable":27,"views":120,"author":121,"categories":122,"tags":124},172,"utiliser-proxy-swift-urlsession","Utiliser un proxy en Swift avec URLSession : guide développeur iOS et macOS","Guide pratique pour configurer des proxies résidentiels, datacenter et SOCKS5 dans URLSession sur iOS et macOS, avec authentification, géo-ciblage, async\u002Fawait et bonnes pratiques de production.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Futiliser-proxy-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\u002Ffr\u002Futiliser-proxy-swift-urlsession-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Futiliser-proxy-swift-urlsession-og.webp","2026-07-26T16:03:44+00:00","2026-10-03T08:57:48+00:00",234,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},[123],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},[],[]]