[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-pl-rotacja-proxy-w-colly-1":3},{"success":4,"payload":5,"related":64,"errors":128},true,{"id":6,"slug":7,"title":8,"excerpt":9,"body_html":10,"meta_title":11,"meta_description":12,"canonical_url":13,"canonical_override":14,"og_title":15,"og_description":16,"og_image_url":17,"faq_json":18,"key_takeaways":14,"allow_index":31,"noindex_google_only":31,"allow_follow":4,"published_at":32,"updated_at":32,"content_updated_at":33,"featured_image_url":34,"featured_image_alt":35,"card_image_url":36,"reading_time_minutes":37,"author":38,"categories":42,"tags":49,"alternates":50,"locale_paths":62,"views":63},175,"rotacja-proxy-w-colly-1","Rotacja Proxy w Colly: Kompletny Przewodnik dla Programistów Go","Praktyczny przewodnik po rotacji proxy w frameworku Colly dla Go. Dowiedz się, jak skonfigurować RoundRobinProxySwitcher, geo-targeting i wzorce produkcyjne z residential proxy.","\u003Cp>Jeśli budujesz scrapery w Go, prawdopodobnie znasz \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgocolly\u002Fcolly\" rel=\"noopener noreferrer\">Colly\u003C\u002Fa> — najpopularniejszy framework do web scrapingu w tym języku. Colly jest szybki, asynchroniczny i idiomatyczny, ale bez odpowiedniej rotacji proxy szybko napotkasz blokad IP, CAPTCHA i bany. W tym przewodniku pokazujemy, jak zaimplementować rotację proxy w Colly używając residential proxy, przełącznika RoundRobinProxySwitcher oraz własnych funkcji proxy z geo-targetowaniem.\u003C\u002Fp>\n\n\u003Cblockquote>\u003Cstrong>Uwaga prawna:\u003C\u002Fstrong> Scrapowanie danych publicznych jest ogólnie legalne, ale musisz przestrzegać \u003Ca href=\"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc9309\" rel=\"noopener noreferrer\">robots.txt (RFC 9309)\u003C\u002Fa>, warunków usług (ToS) witryny oraz przepisów takich jak GDPR i CFAA. Ten artykuł dotyczy wyłącznie danych publicznie dostępnych. Nie zachęcamy do omijania zabezpieczeń ani naruszania praw własności.\u003C\u002Fblockquote>\n\n\u003Ch2>Rotacja proxy w Colly — dlaczego jest niezbędna\u003C\u002Fh2>\n\n\u003Cp>Colly wysyła żądania HTTP asynchronicznie, wykorzystując goroutines i kanały Go. Domyślnie wszystkie żądania wychodzą z jednego adresu IP. Jeśli wykonasz 1000 żądań do tej samej domeny w ciągu minuty, większość nowoczesnych stron wykryje ten wzorzec i zablokuje Twój adres IP — często w ciągu pierwszych 200 żądań.\u003C\u002Fp>\n\n\u003Cp>Rotacja proxy rozwiązuje ten problem, dystrybuując żądania przez wiele adresów IP. Każde żądanie może wychodzić z innego IP, co utrudnia wykrycie wzorca. W Colly rotacja proxy realizowana jest na poziomie \u003Ccode>http.Request\u003C\u002Fcode> — framework pozwala na podmianę URL proxy dla każdego żądania przez mechanizm \u003Ccode>SetProxyFunc\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Cp>Dlaczego \u003Cstrong>residential proxy\u003C\u002Fstrong> są lepsze niż datacenter dla trudnych celów? Strony e-commerce, platformy społecznościowe i wyszukiwarki mają zaawansowane systemy anty-bot, które flagują ranges IP z centrów danych. Residential IP należą do rzeczywistych dostawców internetowych (ISP), co czyni je trudniejszymi do odróżnienia od ruchu organicznego.\u003C\u002Fp>\n\n\u003Ch2>Model Collector w Colly — OnRequest, OnHTML, OnError\u003C\u002Fh2>\n\n\u003Cp>Colly opiera się na wzorcu \u003Cem>Collector\u003C\u002Fem> — obiekcie konfigurowanym przez callbacki. Najważniejsze z nich to:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>OnRequest\u003C\u002Fstrong> — wywoływany przed wysłaniem każdego żądania. Idealne miejsce do ustawiania nagłówków, modyfikacji URL lub logowania.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>OnHTML\u003C\u002Fstrong> — wywoływany po pobraniu strony, gdy HTML jest parsowany przez \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPuerkitoBio\u002Fgoquery\" rel=\"noopener noreferrer\">goquery\u003C\u002Fa>. Pozwala na selektor-based traversal DOM.\u003C\u002Fli>\n\u003Cli>OnError — wywoływany, gdy żądanie kończy się błędem. Tu implementujesz logikę retry.\u003C\u002Fli>\n\u003Cli>OnResponse — wywoływany po otrzymaniu pełnej odpowiedzi, przed parsowaniem HTML.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Tryb asynchroniczny (domyślny w Colly) oznacza, że żądania są kolejkowane i wykonywane równolegle z ograniczeniem współbieżności ustawianym przez \u003Ccode>colly.AsyncOptions.Parallelism\u003C\u002Fcode>. To kluczowe dla wydajności, ale zwiększa ryzyko blokad — dlatego rotacja proxy jest tu krytyczna.\u003C\u002Fp>\n\n\u003Ch2>Przełącznik proxy w Colly — RoundRobinProxySwitcher i SetProxyFunc\u003C\u002Fh2>\n\n\u003Cp>Colly oferuje wbudowany \u003Ccode>proxy.RoundRobinProxySwitcher\u003C\u002Fcode>, który przyjmuje listę URL-i proxy i rotuje je cyklicznie. Oto podstawowy przykład z ProxyHat:\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    \u002F\u002F Lista endpointów ProxyHat (HTTP, port 8080)\n    proxies := []*url.URL{\n        url.Parse(&quot;http:\u002F\u002Fuser-country-US:pass@gate.proxyhat.com:8080&quot;),\n        url.Parse(&quot;http:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080&quot;),\n        url.Parse(&quot;http:\u002F\u002Fuser-country-GB:pass@gate.proxyhat.com:8080&quot;),\n        url.Parse(&quot;http:\u002F\u002Fuser-country-FR:pass@gate.proxyhat.com:8080&quot;),\n    }\n\n    \u002F\u002F RoundRobinProxySwitcher rotuje proxy cyklicznie\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.Printf(&quot;Tytuł: %s | IP proxy: %s&quot;, e.Text, e.Request.ProxyURL)\n    })\n\n    c.Visit(&quot;https:\u002F\u002Fhttpbin.org\u002Fip&quot;)\n    c.Wait()\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>\u003Ccode>SetProxyFunc\u003C\u002Fcode> przyjmuje funkcję typu \u003Ccode>func(*http.Request) (*url.URL, error)\u003C\u002Fcode>. Możesz napisać własną funkcję zamiast RoundRobinProxySwitcher, aby implementować logikę rotacji dostosowaną do Twoich potrzeb — np. wybór kraju na podstawie docelowego URL albo sticky sessions.\u003C\u002Fp>\n\n\u003Ch2>Rotacyjne proxy z geo-targetowaniem — username per request\u003C\u002Fh2>\n\n\u003Cp>ProxyHat pozwala na geo-targetowanie i kontrolę sesji przez nazwę użytkownika. Format to:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Ccode>user-country-DE\u003C\u002Fcode> — proxy z Niemiec\u003C\u002Fli>\n\u003Cli>\u003Ccode>user-country-DE-region-state_of_berlin-city-berlin\u003C\u002Fcode> — proxy z Berlina\u003C\u002Fli>\n\u003Cli>\u003Ccode>user-sid-abc123\u003C\u002Fcode> — sticky session (ten sam IP dla wielu żądań)\u003C\u002Fli>\n\u003Cli>\u003Ccode>user-country-US-sid-xyz789\u003C\u002Fcode> — kombinacja kraju i sesji\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>W Colly możesz dynamicznie generować URL proxy dla każdego żądania, korzystając z własnej funkcji w \u003Ccode>SetProxyFunc\u003C\u002Fcode>. Oto przykład, który rotuje kraje i przypisuje unikalne sesje:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>package main\n\nimport (\n    &quot;crypto\u002Frand&quot;\n    &quot;encoding\u002Fhex&quot;\n    &quot;fmt&quot;\n    &quot;math\u002Frand\u002Fv2&quot;\n    &quot;net\u002Fhttp&quot;\n    &quot;net\u002Furl&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n)\n\nvar countries = []string{&quot;US&quot;, &quot;DE&quot;, &quot;GB&quot;, &quot;FR&quot;, &quot;PL&quot;, &quot;NL&quot;, &quot;SE&quot;, &quot;CA&quot;}\n\nfunc randomSession() string {\n    b := make([]byte, 6)\n    rand.Read(b)\n    return hex.EncodeToString(b)\n}\n\nfunc proxyFunc(r *http.Request) (*url.URL, error) {\n    country := countries[rand.IntN(len(countries))]\n    session := randomSession()\n    proxyURL := fmt.Sprintf(\n        &quot;http:\u002F\u002Fuser-country-%s-sid-%s:pass@gate.proxyhat.com:8080&quot;,\n        country, session,\n    )\n    return url.Parse(proxyURL)\n}\n\nfunc main() {\n    c := colly.NewCollector()\n    c.SetProxyFunc(proxyFunc)\n\n    c.OnHTML(&quot;h1&quot;, func(e *colly.HTMLElement) {\n        fmt.Printf(&quot;Proxy: %s\\n&quot;, e.Request.ProxyURL)\n    })\n\n    c.OnError(func(r *colly.Response, err error) {\n        fmt.Printf(&quot;Błąd: %v (status: %d)\\n&quot;, err, r.StatusCode)\n    })\n\n    c.Visit(&quot;https:\u002F\u002Fhttpbin.org\u002Fip&quot;)\n    c.Wait()\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Ten wzorzec daje pełną kontrolę: każde żądanie wychodzi z innego kraju i innej sesji, co maksymalizuje dywersyfikację IP. Jeśli potrzebujesz sticky session (np. do logowania i utrzymania sesji), użyj tego samego identyfikatora sesji dla całego przepływu.\u003C\u002Fp>\n\n\u003Cp>SOCKS5 jest również obsługiwany — wystarczy zmienić schemat URL i port:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>proxyURL := &quot;socks5:\u002F\u002Fuser-country-US:pass@gate.proxyhat.com:1080&quot;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Kompletny przykład Go — Collector z residential proxy i Limit()\u003C\u002Fh2>\n\n\u003Cp>Poniżej znajduje się kompletny, produkcyjny przykład łączący rotację proxy, limitowanie współbieżności, opóźnienia i logikę retry przez \u003Ccode>c.Clone()\u003C\u002Fcode>:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>package main\n\nimport (\n    &quot;crypto\u002Frand&quot;\n    &quot;encoding\u002Fhex&quot;\n    &quot;fmt&quot;\n    &quot;math\u002Frand\u002Fv2&quot;\n    &quot;net\u002Fhttp&quot;\n    &quot;net\u002Furl&quot;\n    &quot;time&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2\u002Fdebug&quot;\n)\n\nvar countries = []string{&quot;US&quot;, &quot;DE&quot;, &quot;GB&quot;, &quot;FR&quot;, &quot;PL&quot;, &quot;NL&quot;}\n\nfunc randomSession() string {\n    b := make([]byte, 6)\n    rand.Read(b)\n    return hex.EncodeToString(b)\n}\n\nfunc residentialProxyFunc(r *http.Request) (*url.URL, error) {\n    country := countries[rand.IntN(len(countries))]\n    session := randomSession()\n    u := 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(u)\n}\n\nfunc main() {\n    c := colly.NewCollector(\n        colly.MaxDepth(2),\n        colly.UserAgent(&quot;Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64)&quot;),\n    )\n\n    \u002F\u002F Konfiguracja proxy\n    c.SetProxyFunc(residentialProxyFunc)\n\n    \u002F\u002F Limitowanie: max 5 równoległych żądań, losowe opóźnienie 1-3s\n    c.Limit(&amp;colly.LimitRule{\n        DomainGlob:  &quot;*&quot;,\n        Parallelism: 5,\n        Delay:       2 * time.Second,\n        RandomDelay: 1 * time.Second,\n    })\n\n    \u002F\u002F Włącz tryb asynchroniczny\n    c.Async = true\n\n    var visited int\n\n    c.OnHTML(&quot;a[href]&quot;, func(e *colly.HTMLElement) {\n        link := e.Attr(&quot;href&quot;)\n        e.Request.Visit(link)\n    })\n\n    c.OnResponse(func(r *colly.Response) {\n        visited++\n        fmt.Printf(&quot;[%d] %s — status: %d, proxy: %s\\n&quot;,\n            visited, r.Request.URL, r.StatusCode, r.Request.ProxyURL)\n    })\n\n    c.OnError(func(r *colly.Response, err error) {\n        fmt.Printf(&quot;Błąd: %v, status: %d, URL: %s\\n&quot;, err, r.StatusCode, r.Request.URL)\n        \u002F\u002F Retry przez klonowanie collector z nowym proxy\n        if r.StatusCode == 403 || r.StatusCode == 429 {\n            clone := r.Request.Ctx.Colly.Clone()\n            clone.SetProxyFunc(residentialProxyFunc)\n            clone.Visit(r.Request.URL.String())\n        }\n    })\n\n    c.Visit(&quot;https:\u002F\u002Fexample.com&quot;)\n    c.Wait()\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Kluczowe elementy tego przykładu:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>LimitRule z \u003Ccode>Parallelism: 5\u003C\u002Fcode> i \u003Ccode>Delay: 2s\u003C\u002Fcode> + \u003Ccode>RandomDelay: 1s\u003C\u002Fcode> zapobiega zalananiu serwera.\u003C\u002Fli>\n\u003Cli>OnError z retry przez \u003Ccode>c.Clone()\u003C\u002Fcode> tworzy nowy collector z nowym proxy dla nieudanych żądań (403\u002F429).\u003C\u002Fli>\n\u003Cli>MaxDepth(2) ogranicza głębokość crawlowania.\u003C\u002Fli>\n\u003Cli>Async = true włącza asynchroniczne wykonywanie żądań.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Wzorce produkcyjne — skalowanie, retries, distributed scraping\u003C\u002Fh2>\n\n\u003Ch3>Własny Transport z konfiguracją TLS\u003C\u002Fh3>\n\n\u003Cp>Dla trudnych celów, które wymagają specyficznej konfiguracji TLS (np. niestandardowe cipher suites), możesz podmienić \u003Ccode>http.Transport\u003C\u002Fcode> w collectorze:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import (\n    &quot;crypto\u002Ftls&quot;\n    &quot;net\u002Fhttp&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    MaxIdleConns:        100,\n    MaxIdleConnsPerHost: 10,\n    IdleConnTimeout:     30 * time.Second,\n})\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>Distributed scraping z redis storage\u003C\u002Fh3>\n\n\u003Cp>Colly wspiera rozproszone crawlowanie przez kolejki współdzielone. Backend \u003Ccode>redis\u003C\u002Fcode> pozwala wielu instancjom na współdzielenie stanu odwiedzonych URL-i:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import (\n    &quot;github.com\u002Fgocolly\u002Fcolly\u002Fv2&quot;\n    &quot;github.com\u002Fgocolly\u002Fredis&quot;\n)\n\nc := colly.NewCollector()\nstorage := &amp;redis.Storage{\n    Address:     &quot;redis:\u002F\u002Flocalhost:6379&quot;,\n    Prefix:      &quot;colly_scraper_&quot;,\n    Client:      nil,\n}\nc.SetStorage(storage)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>W połączeniu z rotacyjnymi residential proxy z ProxyHat, możesz uruchomić wiele instancji scrapera w kontenerach Docker, każda z własnym zestawem sesji proxy. Skonsultuj \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">dokumentację ProxyHat\u003C\u002Fa>, aby dowiedzieć się więcej o dostępnych krajach i konfiguracji.\u003C\u002Fp>\n\n\u003Ch3>Porównanie typów proxy dla Colly\u003C\u002Fh3>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Cecha\u003C\u002Fth>\n\u003Cth>Residential\u003C\u002Fth>\n\u003Cth>Datacenter\u003C\u002Fth>\n\u003Cth>Mobile\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Wykrywalność przez anty-bot\u003C\u002Ftd>\n\u003Ctd>Niska\u003C\u002Ftd>\n\u003Ctd>Wysoka\u003C\u002Ftd>\n\u003Ctd>Bardzo niska\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Prędkość\u003C\u002Ftd>\n\u003Ctd>Średnia (~100-300 ms)\u003C\u002Ftd>\n\u003Ctd>Wysoka (&lt;50 ms)\u003C\u002Ftd>\n\u003Ctd>Niska (~300-800 ms)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\td>Koszt\u003C\u002Ftd>\n\u003Ctd>Średni\u003C\u002Ftd>\n\u003Ctd>Niski\u003C\u002Ftd>\n\u003Ctd>Wysoki\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Najlepsze zastosowanie\u003C\u002Ftd>\n\u003Ctd>E-commerce, SERP, social media\u003C\u002Ftd>\n\u003Ctd>Proste API, dane publiczne\u003C\u002Ftd>\n\u003Ctd>App mobile, bardzo trudne cele\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Limit równoległych sesji\u003C\u002Ftd>\n\u003Ctd>Wysoki (100+)\u003C\u002Ftd>\n\u003Ctd>Średni\u003C\u002Ftd>\n\u003Ctd>Niski\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>Dla większości zastosowań web scrapingu w Colly residential proxy oferują najlepszy stosunek wydajności do wykrywalności. Sprawdź \u003Ca href=\"\u002Fpl\u002Flocations\">dostępne lokalizacje ProxyHat\u003C\u002Fa>, aby zaplanować strategię geo-targetowania.\u003C\u002Fp>\n\n\u003Ch2>Częste błędy i przypadki brzegowe\u003C\u002Fh2>\n\n\u003Ch3>1. Brak obsługi błędów proxy\u003C\u002Fh3>\n\n\u003Cp>Jeśli proxy zwraca błąd połączenia, Colly wywoła \u003Ccode>OnError\u003C\u002Fcode>. Bez logiki retry tracisz żądanie. Zawsze implementuj retry z nowym proxy przez \u003Ccode>c.Clone()\u003C\u002Fcode> lub kolejkowanie ponownych prób.\u003C\u002Fp>\n\n\u003Ch3>2. Zbyt wysoka współbieżność\u003C\u002Fh3>\n\n\u003Cp>\u003Ccode>Parallelism: 50\u003C\u002Fcode> bez rotacji proxy to gwarancja bana. Utrzymuj współbieżność na poziomie 5-10 równoległych żądań na domenę z rotacją IP.\u003C\u002Fp>\n\n\u003Ch3>3. Ignorowanie robots.txt\u003C\u002Fh3>\n\n\u003Cp>Colly domyślnie nie sprawdza robots.txt. Możesz włączyć to przez \u003Ccode>colly.IgnoreRobotsTxt(false)\u003C\u002Fcode>. Zawsze przestrzegaj \u003Ca href=\"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc9309\" rel=\"noopener noreferrer\">RFC 9309\u003C\u002Fa> i zasady robots.txt.\u003C\u002Fp>\n\n\u003Ch3>4. Brak timeoutów\u003C\u002Fh3>\n\n\u003Cp>Bez timeoutów scraper może zawiesić się na martwym proxy. Ustaw \u003Ccode>c.SetRequestTimeout(30 * time.Second)\u003C\u002Fcode>, aby uniknąć nieskończonego czekania.\u003C\u002Fp>\n\n\u003Ch3>5. Niespójne nagłówki\u003C\u002Fh3>\n\n\u003Cp>Każde żądanie z innym IP, ale z tym samym User-Agent, może zostać wykryte. Używaj realistycznych nagłówków i rotuj je razem z proxy.\u003C\u002Fp>\n\n\u003Ch2>Kiedy NIE używać Colly\u003C\u002Fh2>\n\n\u003Cp>Colly jest świetne dla stron serwerowo renderowanych (SSR), gdzie HTML jest dostępny w odpowiedzi HTTP. Jeśli strona wymaga JavaScript do renderowania treści (SPA oparte na React, Vue, Angular), Colly nie wykona JS i nie zobisz dynamicznej treści. W takich przypadkach rozważ:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>chromedp — sterowanie Chrome w Go przez DevTools Protocol.\u003C\u002Fli>\n\u003Cli>Playwright — przez bindings Go.\u003C\u002Fli>\n\u003Cli>Rod — higher-level wrapper dla chromedp.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Nawet w tych przypadkach rotacja proxy jest konieczna — większość browser-automation frameworks wspiera konfigurację proxy na poziomie launch options.\u003C\u002Fp>\n\n\u003Ch2>Konfiguracja ProxyHat dla Colly\u003C\u002Fh2>\n\n\u003Cp>ProxyHat oferuje residential, mobile i datacenter proxy z geo-targetowaniem na poziomie kraju i miasta. Konfiguracja w Colly jest prosta — wszystkie parametry przekazywane są w nazwie użytkownika. Szczegóły znajdziesz w \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">dokumentacji ProxyHat\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Cp>Dla SERP tracking i monitorowania wyników wyszukiwania, residential proxy z ProxyHat zapewniają 99.9% uptime i tysiące unikalnych IP. Sprawdź naszą stronę \u003Ca href=\"\u002Fpl\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa> oraz \u003Ca href=\"\u002Fpl\u002Fuse-cases\u002Fweb-scraping\">web scraping\u003C\u002Fa>, aby dowiedzieć się więcej o zastosowaniach. Cennik znajdziesz na stronie \u003Ca href=\"\u002Fpl\u002Fpricing\">ProxyHat pricing\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Najważniejsze wnioski\u003C\u002Fh2>\n\n\u003Cblockquote>\n\u003Cul>\n\u003Cli>Rotacja proxy jest obowiązkowa dla jakiegokolwiek scrapera powyżej ~100 żądań do jednej domeny.\u003C\u002Fli>\n\u003Cli>RoundRobinProxySwitcher jest prosty, ale własna funkcja w \u003Ccode>SetProxyFunc\u003C\u002Fcode> daje pełną kontrolę nad geo-targetowaniem i sesjami.\u003C\u002Fli>\n\u003Cli>Residential proxy są najlepsze dla trudnych celów — datacenter IP są łatwo flagowane przez systemy anty-bot.\u003C\u002Fli>\n\u003Cli>LimitRule z \u003Ccode>Parallelism\u003C\u002Fcode> i \u003Ccode>RandomDelay\u003C\u002Fcode> jest kluczowy dla unikania blokad.\u003C\u002Fli>\n\u003Cli>Retry przez c.Clone() pozwala na ponowne próby z nowym proxy przy błędach 403\u002F429.\u003C\u002Fli>\n\u003Cli>Redis storage umożliwia distributed scraping z współdzielonym stanem odwiedzonych URL-i.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Colly nie renderuje JS\u003C\u002Fstrong> — dla SPA używaj chromedp lub Playwright.\u003C\u002Fli>\n\u003Cli>Etyka: przestrzegaj robots.txt, ToS i GDPR. Scrapuj tylko dane publiczne.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>\n\n\u003Cp>Rotacja proxy w Colly to nie dodatek — to fundament produkcyjnego scrapera. Z residential proxy ProxyHat, idiomatycznym \u003Ccode>SetProxyFunc\u003C\u002Fcode> i wzorcami opisanymi w tym artykule, możesz budować scrapery, które działają niezawodnie na dużą skalę.\u003C\u002Fp>","Rotacja Proxy w Colly: Kompletny Przewodnik Go | ProxyHat","Dowiedz się, jak skonfigurować rotację proxy w Colly z residential proxy. Praktyczne przykłady Go, RoundRobinProxySwitcher, geo-targeting i wzorce produkcyjne.","\u002Fpl\u002Fblog\u002Frotacja-proxy-w-colly-1",null,"Rotacja Proxy w Colly: Kompletny Przewodnik | ProxyHat","Praktyczny przewodnik po rotacji proxy w frameworku Colly dla Go. Przykłady kodu, wzorce produkcyjne i residential proxy.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Frotacja-proxy-w-colly-1-og.webp",[19,22,25,28],{"question":20,"answer":21},"Dlaczego rotacja proxy w Colly ma znaczenie dla scraperów?","Bez rotacji proxy wszystkie żądania wychodzą z jednego IP, co pozwala systemom anty-bot na szybką detekcję i blokadę — często po zaledwie 200 żądaniach. Rotacja proxy dystrybuuje ruch przez wiele IP, co utrudnia wykrycie wzorca scrapowania. W połączeniu z residential proxy, które wyglądają jak ruch organiczny, rotacja znacząco zwiększa niezawodność scrapera.",{"question":23,"answer":24},"Który typ proxy najlepiej sprawdza się w Colly?","Dla większości zastosowań web scrapingu w Colly residential proxy oferują najlepszy kompromis między wydajnością a wykrywalnością. Mają niską wykrywalność przez systemy anty-bot, średnią latencję około 100-300 ms i wysoką liczbę równoległych sesji. Datacenter proxy są szybsze i tańsze, ale łatwo flagowane. Mobile proxy są najtrudniejsze do wykrycia, ale wolniejsze i droższe.",{"question":26,"answer":27},"Jak unikać blokad implementując rotację proxy w Colly?","Aby unikać blokad, używaj residential proxy z rotacją per-żądanie, ustawiaj LimitRule z Parallelism na 5-10 i RandomDelay 1-3 sekundy. Implementuj retry przez c.Clone() dla błędów 403\u002F429. Rotuj nie tylko proxy, ale też nagłówki User-Agent. Przestrzegaj robots.txt i utrzymuj timeout żądań na poziomie 30 sekund, aby unikać zawieszeń na martwych proxy.",{"question":29,"answer":30},"Czy Colly nadaje się do scrapowania stron JavaScript SPA?","Nie, Colly nie renderuje JavaScript. Jest frameworkiem do scrapowania HTML serwerowo renderowanego (SSR). Dla stron SPA opartych na React, Vue czy Angular, które wymagają wykonania JS do wyrenderowania treści, należy użyć narzędzi takich jak chromedp, Playwright lub Rod. Nawet w tych przypadkach rotacja proxy pozostaje konieczna — większość frameworków browser-automation wspiera konfigurację proxy.",false,"2026-08-04T10:05:34+00:00","2026-10-03T08:29:56+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Frotacja-proxy-w-colly-1-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Frotacja-proxy-w-colly-1-card.webp",12,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[43],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},4,"developer-guides","Przewodniki dla programistów","Przewodniki dla programistów 124; ProxyHat Blog","Poradniki kodowe i przewodniki SDK do integracji proxy z aplikacjami.",[],{"es":51,"ru":52,"ja":53,"pt":54,"pl":13,"ko":55,"tr":56,"zh":57,"it":58,"de":59,"en":60,"fr":61,"x-default":60},"\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","\u002Fko\u002Fblog\u002Fcolly-rotating-proxy-guide","\u002Ftr\u002Fblog\u002Fcolly-doner-proxy-rehberi","\u002Fcn\u002Fblog\u002Fcolly-lunhuan-daili-shixian-zhinan","\u002Fit\u002Fblog\u002Fproxy-rotanti-in-colly-guida","\u002Fde\u002Fblog\u002Frotierende-proxies-in-colly","\u002Fblog\u002Frotating-proxies-in-colly-golang","\u002Ffr\u002Fblog\u002Frotation-proxies-colly-golang-1",{"es":51,"ru":52,"ja":53,"pt":54,"pl":13,"ko":55,"tr":56,"zh":57,"it":58,"de":59,"en":60,"fr":61},71,[65,81,97,113],{"id":66,"slug":67,"title":68,"excerpt":69,"featured_image_url":70,"featured_image_alt":71,"card_image_url":72,"og_image_url":73,"published_at":74,"updated_at":74,"content_updated_at":75,"reading_time_minutes":37,"is_featured":31,"indexable":4,"views":76,"author":77,"categories":78,"tags":80},176,"got-scraping-nodejs-proxy","got-scraping w Node.js: kompletny przewodnik po proxy i header generator","got-scraping to biblioteka HTTP dla Node.js oparta na got, zaprojektowana do scrapingu. Dowiedz się, jak łączyć ją z residential proxy ProxyHat, konfigurować header generator i unikać blokad na dużą skalę.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fgot-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\u002Fpl\u002Fgot-scraping-nodejs-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fgot-scraping-nodejs-proxy-og.webp","2026-08-04T16:05:06+00:00","2026-10-03T08:57:48+00:00",121,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},[79],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},[],{"id":82,"slug":83,"title":84,"excerpt":85,"featured_image_url":86,"featured_image_alt":87,"card_image_url":88,"og_image_url":89,"published_at":90,"updated_at":90,"content_updated_at":91,"reading_time_minutes":37,"is_featured":31,"indexable":4,"views":92,"author":93,"categories":94,"tags":96},195,"jak-scrapowac-bybit-v5-api-proxy","Pobieranie danych rynkowych krypto z rotującymi proxy (przykład: API rynku Bybit V5)","Przewodnik dla programistów: pobieraj dane orderbook, tickers i kline z Bybit V5 Market API z rotującymi proxy ProxyHat. Gotowe przykłady w Python i Node.js, obsługa limitów, geo-blokad i sesji sticky.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-bybit-v5-api-proxy-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-bybit-v5-api-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-bybit-v5-api-proxy-og.webp","2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00",87,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},[95],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},[],{"id":98,"slug":99,"title":100,"excerpt":101,"featured_image_url":102,"featured_image_alt":103,"card_image_url":104,"og_image_url":105,"published_at":106,"updated_at":106,"content_updated_at":107,"reading_time_minutes":37,"is_featured":31,"indexable":31,"views":108,"author":109,"categories":110,"tags":112},194,"jak-scrapowac-rest-api-binance-proxy","Jak scrapować REST API Binance z proxy — przewodnik dla programistów","Kompletny przewodnik po pobieraniu publicznych danych rynkowych z REST API Binance z wykorzystaniem rotacyjnych proxy. Przykłady kodu w Python i Node.js, limit wag, sesje sticky i strategie omijania blokad IP.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-rest-api-binance-proxy-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-rest-api-binance-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-rest-api-binance-proxy-og.webp","2026-08-03T10:04:04+00:00","2026-10-03T08:29:51+00:00",82,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},[111],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},[],{"id":114,"slug":115,"title":116,"excerpt":117,"featured_image_url":118,"featured_image_alt":119,"card_image_url":120,"og_image_url":121,"published_at":122,"updated_at":122,"content_updated_at":75,"reading_time_minutes":37,"is_featured":31,"indexable":4,"views":123,"author":124,"categories":125,"tags":127},172,"uzywanie-proxy-w-swift-urlsession","Używanie proxy w Swift z URLSession — przewodnik dla programistów iOS i macOS","Kompletny przewodnik po konfiguracji proxy w Swift z URLSession: HTTP\u002FHTTPS, SOCKS5, autoryzacja, geo-targeting, async\u002Fawait i wskazówki produkcyjne.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fuzywanie-proxy-w-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\u002Fpl\u002Fuzywanie-proxy-w-swift-urlsession-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fuzywanie-proxy-w-swift-urlsession-og.webp","2026-07-26T16:03:44+00:00",234,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},[126],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},[],[]]