[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-en-rotating-proxies-in-colly-golang":3},{"success":4,"payload":5,"related":59,"errors":150},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":8,"card_image_url":31,"reading_time_minutes":32,"author":33,"categories":37,"tags":44,"alternates":45,"locale_paths":57,"views":58},175,"rotating-proxies-in-colly-golang","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","A developer-first guide to implementing rotating proxies in Colly using residential IPs, custom proxy switchers, geo-targeting, and production patterns for high-throughput Go web scraping.","\u003Cp>If you've built a Go scraper with Colly and watched it get IP-banned after 50 requests, you already know why rotating proxies in Colly is non-negotiable for production scraping. Anti-bot systems fingerprint your IP, throttle by subnet, and block datacenter ranges outright. Colly gives you a clean, idiomatic proxy surface—but most guides stop at a single hard-coded proxy string, which defeats the purpose entirely.\u003C\u002Fp>\n\u003Cp>Before diving in: this guide covers scraping publicly accessible data only. In the U.S., the Computer Fraud and Abuse Act (CFAA) and in the EU, the \u003Ca href=\"https:\u002F\u002Feur-lex.europa.eu\u002Feli\u002Freg\u002F2016\u002F679\u002Foj\" rel=\"noopener noreferrer\">GDPR\u003C\u002Fa> set boundaries on what you can collect and how. Always respect \u003Ccode>robots.txt\u003C\u002Fcode> and target-site terms of service. See the official \u003Ca href=\"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc9308\" rel=\"noopener noreferrer\">RFC 9308\u003C\u002Fa> for the robots.txt specification.\u003C\u002Fp>\n\n\u003Ch2>Why Rotating Proxies in Colly Matter\u003C\u002Fh2>\n\u003Cp>Colly is Go's most popular scraping framework, built on top of \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPuerkitoBio\u002Fgoquery\" rel=\"noopener noreferrer\">goquery\u003C\u002Fa> for DOM traversal and the standard \u003Ccode>net\u002Fhttp\u003C\u002Fcode> stack for transport. It's fast—a single-threaded collector can handle 1,000+ requests per second on modest hardware—but that speed is exactly what gets you blocked. A single IP hammering a target at 200ms intervals triggers rate-limiting, CAPTCHA challenges, or outright 403 responses within minutes.\u003C\u002Fp>\n\u003Cp>Rotating proxies solve this by distributing requests across many IP addresses. But not all proxies are equal. Datacenter IPs are cheap and fast but flagged by most modern anti-bot systems. Residential IPs—real ISP-assigned addresses—blend in with organic traffic and are dramatically harder to detect. For hard targets like search engines, ticketing platforms, or e-commerce price monitors, residential proxies are the baseline requirement, not a luxury.\u003C\u002Fp>\n\n\u003Ch2>Colly's Collector Model: Callbacks, Async, and goquery\u003C\u002Fh2>\n\u003Cp>Understanding Colly's architecture is essential before wiring in proxies. A \u003Ccode>Collector\u003C\u002Fcode> is Colly's central object. You register callbacks on it, and each callback fires at a specific point in the request lifecycle:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>OnRequest\u003C\u002Fcode>\u003C\u002Fstrong> — fires before each HTTP request is sent. This is where you can inspect or modify headers, the proxy assignment, and the URL.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>OnResponse\u003C\u002Fcode>\u003C\u002Fstrong> — fires after a response is received, before HTML parsing. Useful for inspecting status codes or raw body.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>OnHTML\u003C\u002Fcode>\u003C\u002Fstrong> — fires when a CSS selector matches elements in the parsed DOM. Powered by goquery, this gives you jQuery-like traversal (\u003Ccode>e.ChildText()\u003C\u002Fcode>, \u003Ccode>e.ForEach()\u003C\u002Fcode>, \u003Ccode>e.Attr()\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>OnError\u003C\u002Fcode>\u003C\u002Fstrong> — fires on network errors, non-2xx status codes, or callback panics. This is your retry hook.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>OnScraped\u003C\u002Fcode>\u003C\u002Fstrong> — fires after all callbacks complete for a request. Good for cleanup or logging.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Colly runs asynchronously by default. When you call \u003Ccode>c.Visit()\u003C\u002Fcode>, the request is dispatched on a goroutine. The \u003Ccode>Limit()\u003C\u002Fcode> method controls concurrency per domain—setting \u003Ccode>Parallelism\u003C\u002Fcode> and \u003Ccode>Delay\u003C\u002Fcode> prevents you from overwhelming a single target. This matters for proxy rotation because each concurrent request may need a different proxy, and Colly's proxy switcher is called per-request, not per-collector.\u003C\u002Fp>\n\n\u003Ch2>The Idiomatic Proxy Surface: RoundRobinProxySwitcher and SetProxyFunc\u003C\u002Fh2>\n\u003Cp>Colly exposes two idiomatic mechanisms for proxy rotation. The first is \u003Ccode>proxy.RoundRobinProxySwitcher\u003C\u002Fcode>, a built-in round-robin switcher from the \u003Ccode>github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fproxy\u003C\u002Fcode> package:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>package main\n\nimport (\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\n    proxies := []string{\n        &quot;http:\u002F\u002Fuser-country-US:YOUR_PASSWORD@gate.proxyhat.com:8080&quot;,\n        &quot;http:\u002F\u002Fuser-country-DE:YOUR_PASSWORD@gate.proxyhat.com:8080&quot;,\n        &quot;http:\u002F\u002Fuser-country-GB:YOUR_PASSWORD@gate.proxyhat.com:8080&quot;,\n    }\n\n    switcher, err := proxy.RoundRobinProxySwitcher(proxies...)\n    if err != nil {\n        log.Fatal(err)\n    }\n    c.SetProxyFunc(switcher)\n\n    c.OnHTML(&quot;title&quot;, func(e *colly.HTMLElement) {\n        log.Println(e.Text)\n    })\n\n    c.Visit(&quot;https:\u002F\u002Fexample.com&quot;)\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>This works for simple cases but has a limitation: the proxy list is fixed at initialization. For production scraping, you need dynamic rotation—different countries, sticky sessions for multi-page flows, or per-request geo-targeting. That's where the second mechanism shines: \u003Ccode>c.SetProxyFunc(func(*http.Request) (*url.URL, error))\u003C\u002Fcode>. You pass a custom function that receives each \u003Ccode>http.Request\u003C\u002Fcode> and returns a proxy URL. This is the framework-idiomatic extension point for any proxy logic.\u003C\u002Fp>\n\n\u003Ch2>Why Residential IPs Beat Datacenter for Hard Targets\u003C\u002Fh2>\n\u003Cp>Residential proxies route traffic through real ISP-assigned IP addresses. When a target site checks the ASN of an incoming request, it sees Comcast, Deutsche Telekom, or Vodafone—not AWS or DigitalOcean. This makes residential IPs far harder to block at the network level.\u003C\u002Fp>\n\u003Cp>ProxyHat's residential proxy gateway supports geo-targeting and session stickiness through the username field. The format is:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>user-country-DE:pass\u003C\u002Fcode> — rotate within German IPs\u003C\u002Fli>\n\u003Cli>\u003Ccode>user-country-DE-region-state_of_berlin-city-berlin:pass\u003C\u002Fcode> — pin to Berlin\u003C\u002Fli>\n\u003Cli>\u003Ccode>user-sid-abc123:pass\u003C\u002Fcode> — sticky session (same IP for the session ID)\u003C\u002Fli>\n\u003Cli>\u003Ccode>user-country-US-sid-abc123:pass\u003C\u002Fcode> — sticky session within US IPs\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Combining \u003Ccode>-country-\u003C\u002Fcode> and \u003Ccode>-sid-\u003C\u002Fcode> flags gives you per-request geo-targeting with optional stickiness. For SERP tracking, you want a fresh IP per request. For multi-page checkout flows, you want the same IP across all requests in the flow.\u003C\u002Fp>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Proxy Type\u003C\u002Fth>\n\u003Cth>Detection Risk\u003C\u002Fth>\n\u003Cth>Best Use Case\u003C\u002Fth>\n\u003Cth>Relative Cost\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Residential\u003C\u002Ftd>\n\u003Ctd>Low\u003C\u002Ftd>\n\u003Ctd>SERP scraping, e-commerce, hard targets\u003C\u002Ftd>\n\u003Ctd>High\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Datacenter\u003C\u002Ftd>\n\u003Ctd>High\u003C\u002Ftd>\n\u003Ctd>Internal APIs, low-friction targets\u003C\u002Ftd>\n\u003Ctd>Low\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Mobile\u003C\u002Ftd>\n\u003Ctd>Very Low\u003C\u002Ftd>\n\u003Ctd>Social media, app-store scraping\u003C\u002Ftd>\n\u003Ctd>Highest\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>For a deeper comparison of proxy types and their trade-offs, see the \u003Ca href=\"\u002Fuse-cases\u002Fweb-scraping\">web scraping use case guide\u003C\u002Fa>. You can also browse available \u003Ca href=\"\u002Flocations\">proxy locations\u003C\u002Fa> to plan your geo-targeting strategy.\u003C\u002Fp>\n\n\u003Ch2>Runnable Example: Residential Proxy Rotation with Geo-Targeting\u003C\u002Fh2>\n\u003Cp>Here's a complete, runnable Colly scraper with a custom proxy switcher that rotates country and session per request, enforces rate limits, and uses Colly's queue for distributed URL management:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>package main\n\nimport (\n    &quot;fmt&quot;\n    &quot;log&quot;\n    &quot;net\u002Fhttp&quot;\n    &quot;net\u002Furl&quot;\n    &quot;sync\u002Fatomic&quot;\n    &quot;time&quot;\n\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fqueue&quot;\n)\n\nvar reqCounter uint64\n\nfunc residentialSwitcher(r *http.Request) (*url.URL, error) {\n    n := atomic.AddUint64(&amp;reqCounter, 1)\n    countries := []string{&quot;US&quot;, &quot;DE&quot;, &quot;GB&quot;, &quot;FR&quot;, &quot;JP&quot;, &quot;CA&quot;, &quot;AU&quot;}\n    country := countries[n%uint64(len(countries))]\n    session := fmt.Sprintf(&quot;rot-%d&quot;, n)\n\n    proxyStr := fmt.Sprintf(\n        &quot;http:\u002F\u002Fuser-country-%s-sid-%s:YOUR_PASSWORD@gate.proxyhat.com:8080&quot;,\n        country, session,\n    )\n    return url.Parse(proxyStr)\n}\n\nfunc main() {\n    c := colly.NewCollector(\n        colly.MaxDepth(2),\n        colly.UserAgent(&quot;Mozilla\u002F5.0 (compatible; MyBot\u002F1.0)&quot;),\n    )\n\n    c.SetProxyFunc(residentialSwitcher)\n\n    \u002F\u002F Rate limit: 20 concurrent requests, 2s delay + 500ms jitter\n    c.Limit(&amp;colly.LimitRule{\n        DomainGlob:  &quot;*&quot;,\n        Parallelism:  20,\n        Delay:        2 * time.Second,\n        RandomDelay:  500 * time.Millisecond,\n    })\n\n    c.OnHTML(&quot;a[href]&quot;, func(e *colly.HTMLElement) {\n        link := e.Request.AbsoluteURL(e.Attr(&quot;href&quot;))\n        e.Request.Visit(link)\n    })\n\n    c.OnHTML(&quot;title&quot;, func(e *colly.HTMLElement) {\n        fmt.Printf(&quot;[%s] %s\\n&quot;, e.Request.URL, e.Text)\n    })\n\n    c.OnError(func(r *colly.Response, err error) {\n        log.Printf(&quot;Error %d on %s: %v&quot;, r.StatusCode, r.Request.URL, err)\n    })\n\n    \u002F\u002F In-memory queue for URL management\n    q, _ := queue.New(\n        2,\n        &amp;queue.InMemoryQueueStorage{MaxSize: 10000},\n    )\n    q.AddURL(&quot;https:\u002F\u002Fexample.com&quot;)\n    q.Run(c)\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>The key design decisions here: \u003Ccode>atomic.AddUint64\u003C\u002Fcode> gives us a thread-safe counter for unique session IDs. The \u003Ccode>LimitRule\u003C\u002Fcode> with \u003Ccode>Parallelism: 20\u003C\u002Fcode> and a 2-second base delay plus 500ms jitter keeps request patterns looking organic. The queue decouples URL discovery from URL processing, which matters at scale.\u003C\u002Fp>\n\n\u003Ch2>Production Patterns: Retries, TLS, and Distributed Queues\u003C\u002Fh2>\n\n\u003Ch3>Retries with c.Clone()\u003C\u002Fh3>\n\u003Cp>Colly's \u003Ccode>OnError\u003C\u002Fcode> callback is where you handle transient failures. For 429 (Too Many Requests) or 5xx errors, you can retry with backoff. Colly's \u003Ccode>Response.Request.Retry()\u003C\u002Fcode> method re-queues the request. For more complex retry logic—different proxy, different headers—use \u003Ccode>c.Clone()\u003C\u002Fcode> to create a shallow copy of the collector with the same callbacks but a fresh transport:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>c.OnError(func(r *colly.Response, err error) {\n    if r.StatusCode == 429 || r.StatusCode &gt;= 500 {\n        log.Printf(&quot;Retrying %s (status %d)&quot;, r.Request.URL, r.StatusCode)\n        time.Sleep(5 * time.Second)\n        r.Request.Retry(3)\n    }\n})\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>Custom TLS Configuration\u003C\u002Fh3>\n\u003Cp>Some targets require specific TLS settings—SNI matching, custom cipher suites, or certificate pinning bypass. Colly exposes the underlying \u003Ccode>http.Transport\u003C\u002Fcode> via \u003Ccode>c.WithTransport()\u003C\u002Fcode>. You can set a custom \u003Ccode>tls.Config\u003C\u002Fcode> to control TLS fingerprinting:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import (\n    &quot;crypto\u002Ftls&quot;\n    &quot;net\u002Fhttp&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n)\n\nc := colly.NewCollector()\nc.WithTransport(&amp;http.Transport{\n    TLSClientConfig: &amp;tls.Config{\n        InsecureSkipVerify: false,\n        MinVersion:         tls.VersionTLS12,\n    },\n    Proxy: http.ProxyFromEnvironment,\n})\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Note that when using \u003Ccode>SetProxyFunc\u003C\u002Fcode>, Colly handles proxy assignment internally—you don't need to set \u003Ccode>Proxy\u003C\u002Fcode> on the transport manually. The \u003Ccode>SetProxyFunc\u003C\u002Fcode> approach is preferred because it integrates with Colly's per-request lifecycle.\u003C\u002Fp>\n\n\u003Ch3>Distributed Scraping with Redis Storage\u003C\u002Fh3>\n\u003Cp>For multi-instance scraping—running Colly across containers or VMs—you need a shared queue and deduplication state. Colly's \u003Ccode>queue\u003C\u002Fcode> package supports pluggable storage backends. The \u003Ccode>github.com\u002Fgocolly\u002Fredisstorage\u003C\u002Fcode> package provides a Redis-backed queue that multiple Colly instances can consume from:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import (\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fqueue&quot;\n    &quot;github.com\u002Fgocolly\u002Fredisstorage&quot;\n)\n\nredisStorage := &amp;redisstorage.Storage{\n    Address:  &quot;redis:6379&quot;,\n    Password: &quot;&quot;,\n    DB:       0,\n    Prefix:   &quot;colly_scraper&quot;,\n}\n\nq, _ := queue.New(3, redisStorage)\ndefer redisStorage.Client.Close()\n\nq.AddURL(&quot;https:\u002F\u002Fexample.com&quot;)\nq.Run(c)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>With Redis storage, you can horizontally scale: launch 5 containers, each running a Colly instance pointed at the same Redis queue. URLs are distributed across workers, and deduplication is shared—no two workers scrape the same URL. This pattern scales to 100+ concurrent sessions with residential proxies, giving you aggregate throughput of 50+ requests per second across a fleet.\u003C\u002Fp>\n\n\u003Cp>For containerization, the standard approach is a multi-stage Dockerfile with a scratch or alpine final image. Each container runs one Colly process, connects to a shared Redis instance, and uses ProxyHat's gateway for proxy rotation. See the \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">ProxyHat documentation\u003C\u002Fa> for gateway configuration details and \u003Ca href=\"\u002Fpricing\">pricing\u003C\u002Fa> for residential proxy plans.\u003C\u002Fp>\n\n\u003Ch2>When Colly Isn't the Right Tool\u003C\u002Fh2>\n\u003Cp>Colly is an HTTP client scraper. It does not execute JavaScript. If your target is a single-page application (SPA) that renders content client-side via React, Vue, or Angular, Colly will see an empty \u003Ccode>&lt;div id=\"root\"&gt;\u003C\u002Fcode> and nothing else. In these cases, you need a headless browser—Playwright, Puppeteer, or Chromium with a Go wrapper like \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fchromedp\u002Fchromedp\" rel=\"noopener noreferrer\">chromedp\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>You can still use ProxyHat proxies with browser-based tools. The proxy configuration goes on the browser launch flags (\u003Ccode>--proxy-server=http:\u002F\u002Fgate.proxyhat.com:8080\u003C\u002Fcode>) or via a proxy authentication extension. The rotation strategy changes—browsers maintain connections longer, so sticky sessions become more important, and you rotate at the browser instance level rather than per-request.\u003C\u002Fp>\n\u003Cp>For \u003Ca href=\"\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa> and static-content scraping, Colly with residential proxies is the right tool: fast, lightweight, and idiomatic Go.\u003C\u002Fp>\n\n\u003Ch2>Key Takeaways\u003C\u002Fh2>\n\u003Cblockquote>\n\u003Cul>\n\u003Cli>Use \u003Ccode>c.SetProxyFunc()\u003C\u002Fcode> with a custom \u003Ccode>func(*http.Request) (*url.URL, error)\u003C\u002Fcode> for dynamic, per-request proxy rotation—this is Colly's idiomatic extension point.\u003C\u002Fli>\n\u003Cli>Residential proxies are required for hard targets. Rotate \u003Ccode>-country-\u003C\u002Fcode> and \u003Ccode>-sid-\u003C\u002Fcode> flags in the ProxyHat username for geo-targeting and stickiness.\u003C\u002Fli>\n\u003Cli>Always set \u003Ccode>Limit()\u003C\u002Fcode> rules with \u003Ccode>Parallelism\u003C\u002Fcode>, \u003Ccode>Delay\u003C\u002Fcode>, and \u003Ccode>RandomDelay\u003C\u002Fcode> to make traffic patterns look organic.\u003C\u002Fli>\n\u003Cli>Use \u003Ccode>OnError\u003C\u002Fcode> with \u003Ccode>r.Request.Retry()\u003C\u002Fcode> for transient failures (429, 5xx). Clone collectors for retry with modified settings.\u003C\u002Fli>\n\u003Cli>Scale horizontally with Redis-backed queues for distributed, multi-container scraping.\u003C\u002Fli>\n\u003Cli>Colly doesn't execute JavaScript. For SPAs, use a headless browser with proxy flags instead.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>","Rotating Proxies in Colly: Go Scraping Guide | ProxyHat","Learn rotating proxies in Colly with residential IPs, custom proxy switchers, geo-targeting, retries, and distributed queue patterns for production Go scraping.","\u002Fblog\u002Frotating-proxies-in-colly-golang",null,"Implement rotating proxies in Colly with residential IPs, custom switchers, geo-targeting, and production patterns for Go web scraping.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Frotating-proxies-in-colly-golang-og.webp",[18,21,24],{"question":19,"answer":20},"Why does rotating proxies in Colly matter for proxy users?","Without proxy rotation, a Colly scraper sends all requests from a single IP address. Anti-bot systems detect this pattern quickly—often within 50 requests—and respond with rate limiting (429), CAPTCHAs, or IP bans (403). Rotating proxies distribute requests across many IP addresses, making traffic appear organic. Residential proxies are especially effective because they use real ISP-assigned IPs that are harder to fingerprint than datacenter ranges.",{"question":22,"answer":23},"Which proxy type works best for rotating proxies in Colly?","Residential proxies work best for most production scraping targets. They route traffic through real ISP-assigned IP addresses, so target sites see organic-looking traffic rather than flagged datacenter ranges. Datacenter proxies are cheaper and faster but are blocked by most modern anti-bot systems. Mobile proxies offer the lowest detection risk but at the highest cost. For SERP scraping, e-commerce price monitoring, and ticketing, residential proxies are the standard choice.",{"question":25,"answer":26},"How do you avoid blocks when implementing rotating proxies in Colly?","Beyond proxy rotation, set Colly's Limit() rules with Parallelism, Delay, and RandomDelay to control request rate and add jitter. Use realistic User-Agent strings. Implement retry logic in OnError for 429 and 5xx responses with exponential backoff. Rotate country and session flags in the proxy username per request. For multi-page flows, use sticky sessions to maintain the same IP across related requests. Always respect robots.txt and target-site rate limits.",false,"2026-08-04T10:05:34+00:00","2026-10-03T08:29:56+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Frotating-proxies-in-colly-golang-master.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Frotating-proxies-in-colly-golang-card.webp",12,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[38],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},4,"developer-guides","Developer Guides","Developer Guides | ProxyHat Blog","Code tutorials and SDK guides for integrating proxies into your applications.",[],{"es":46,"ja":47,"ru":48,"pt":49,"pl":50,"ko":51,"tr":52,"zh":53,"it":54,"de":55,"en":13,"fr":56,"x-default":13},"\u002Fes\u002Fblog\u002Frotacion-proxies-colly-golang-1","\u002Fja\u002Fblog\u002Fcolly-purokushi-roteshon-gaido","\u002Fru\u002Fblog\u002Frotaciya-proksi-v-colly-1","\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","\u002Ffr\u002Fblog\u002Frotation-proxies-colly-golang-1",{"es":46,"ja":47,"ru":48,"pt":49,"pl":50,"ko":51,"tr":52,"zh":53,"it":54,"de":55,"en":13,"fr":56},73,[60,93,119,134],{"id":61,"slug":62,"title":63,"excerpt":64,"featured_image_url":65,"featured_image_alt":63,"card_image_url":66,"og_image_url":67,"published_at":68,"updated_at":69,"content_updated_at":70,"reading_time_minutes":71,"is_featured":27,"indexable":4,"views":72,"author":73,"categories":74,"tags":76},210,"proxy-setup-for-ai-agents","Proxy Setup for AI Agents: browser-use, Crawl4AI and an MCP Server","Agents on cloud VMs exit from datacenter IPs. Here is current, working proxy configuration for browser-use, Crawl4AI and an MCP server, with a sticky-vs-rotating decision table and the cost traps to avoid.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fproxy-setup-for-ai-agents-master.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fproxy-setup-for-ai-agents-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fproxy-setup-for-ai-agents-og.webp","2026-10-24T09:00:00+00:00","2026-10-24T09:00:20+00:00","2026-10-03T09:31:26+00:00",14,18,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[75],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[77,81,85,89],{"id":78,"slug":79,"name":80},1,"web-scraping","Web Scraping",{"id":82,"slug":83,"name":84},2,"residential-proxies","Residential Proxies",{"id":86,"slug":87,"name":88},9,"python","Python",{"id":90,"slug":91,"name":92},22,"playwright","Playwright",{"id":94,"slug":95,"title":96,"excerpt":97,"featured_image_url":98,"featured_image_alt":96,"card_image_url":99,"og_image_url":100,"published_at":101,"updated_at":102,"content_updated_at":70,"reading_time_minutes":71,"is_featured":27,"indexable":4,"views":103,"author":104,"categories":105,"tags":107},206,"camoufox-residential-proxies-python-guide","Camoufox with Residential Proxies: A Code-First Python Guide","How to run Camoufox, the C++-patched Firefox, behind residential proxies: current Python API, why geoip needs a sticky session, a fingerprint coherence checklist, and when Patchright or nodriver fits better.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fcamoufox-residential-proxies-python-guide-master.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fcamoufox-residential-proxies-python-guide-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fcamoufox-residential-proxies-python-guide-og.webp","2026-10-13T09:00:00+00:00","2026-10-13T09:00:22+00:00",33,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[106],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[108,109,110,114,115],{"id":78,"slug":79,"name":80},{"id":82,"slug":83,"name":84},{"id":111,"slug":112,"name":113},6,"anti-detection","Anti-Detection",{"id":86,"slug":87,"name":88},{"id":116,"slug":117,"name":118},21,"headless-browser","Headless Browser",{"id":120,"slug":121,"title":122,"excerpt":123,"featured_image_url":124,"featured_image_alt":122,"card_image_url":125,"og_image_url":126,"published_at":127,"updated_at":127,"content_updated_at":128,"reading_time_minutes":32,"is_featured":27,"indexable":4,"views":129,"author":130,"categories":131,"tags":133},176,"got-scraping-nodejs-residential-proxies","got-scraping in Node.js: A Developer's Guide with Residential Proxies","A practical guide to using Apify's got-scraping HTTP client in Node.js with residential proxies — header generation, proxy rotation, retry hooks, and Crawlee scaling patterns for production scrapers.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fgot-scraping-nodejs-residential-proxies-master.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fgot-scraping-nodejs-residential-proxies-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fgot-scraping-nodejs-residential-proxies-og.webp","2026-08-04T16:05:06+00:00","2026-10-03T08:29:58+00:00",123,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[132],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],{"id":135,"slug":136,"title":137,"excerpt":138,"featured_image_url":139,"featured_image_alt":140,"card_image_url":141,"og_image_url":142,"published_at":143,"updated_at":143,"content_updated_at":144,"reading_time_minutes":32,"is_featured":27,"indexable":4,"views":145,"author":146,"categories":147,"tags":149},195,"scrape-bybit-v5-market-api-rotating-proxies","Unified Crypto Market Data APIs with Rotating Proxies: Rate Limits, Geo-Blocks and Pagination (Bybit V5 Example)","A developer-first guide to scraping Bybit's unified V5 Market API endpoints with rotating residential proxies, rate-limit budgeting, retries, and sticky-session pagination.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fscrape-bybit-v5-market-api-rotating-proxies-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fscrape-bybit-v5-market-api-rotating-proxies-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fen\u002Fscrape-bybit-v5-market-api-rotating-proxies-og.webp","2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00",88,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[148],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],[]]