Proxy di Go: net/http, Colly, dan sesi sticky
Cara memasang residential proxy di Go lewat net/http, Colly, dan SOCKS5, lengkap dengan rotating, sticky session, dan tips hemat kuota.
Go (Golang) jadi pilihan populer untuk scraping dan otomasi berkat goroutine yang ringan dan library HTTP bawaan yang lengkap. Panduan ini menunjukkan cara memasang proxy WaroengProxy di tiga skenario umum: net/http standar, framework scraping Colly, dan koneksi SOCKS5.
1. net/http dengan proxy HTTP
Cara paling dasar: atur http.Transport dengan Proxy yang menunjuk ke endpoint proxy. Semua request lewat transport ini keluar dari IP residential.
package mainimport ("fmt""io""net/http""net/url")func main() {proxyURL, _ := url.Parse("http://USERNAME-cc-ID:PASSWORD@proxy.waroengproxy.com:8000")client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},}resp, err := client.Get("https://ipinfo.io/json")if err != nil {fmt.Println("error:", err)return}defer resp.Body.Close()body, _ := io.ReadAll(resp.Body)fmt.Println(string(body))}
Ganti USERNAME dan PASSWORD dengan kredensialmu dari dashboard. Parameter -cc-ID memilih IP Indonesia; hapus kalau mau IP acak dari seluruh jaringan.
2. Proxy dari variabel lingkungan
Go membaca HTTP_PROXY dan HTTPS_PROXY secara otomatis lewat http.ProxyFromEnvironment (transport bawaan). Kalau kamu tidak ingin hardcode URL proxy di kode, cukup set variabel lingkungan:
# Linux / macOSexport HTTP_PROXY="http://USERNAME-cc-ID:PASSWORD@proxy.waroengproxy.com:8000"export HTTPS_PROXY="$HTTP_PROXY"go run main.go# Windows PowerShell$env:HTTP_PROXY = "http://USERNAME-cc-ID:PASSWORD@proxy.waroengproxy.com:8000"$env:HTTPS_PROXY = $env:HTTP_PROXYgo run main.go
Pakai NO_PROXY untuk mengecualikan host yang tidak perlu lewat proxy, misalnya NO_PROXY=localhost,127.0.0.1.
3. SOCKS5
Kalau butuh SOCKS5, pakai package golang.org/x/net/proxy. Skema socks5 di Go sudah menyerahkan resolusi DNS ke proxy (setara socks5h di curl), jadi tidak ada kebocoran DNS.
import ("golang.org/x/net/proxy""net/http")dialer, _ := proxy.SOCKS5("tcp", "proxy.waroengproxy.com:8000",&proxy.Auth{User: "USERNAME-cc-ID", Password: "PASSWORD"}, proxy.Direct)client := &http.Client{Transport: &http.Transport{DialContext: dialer.(proxy.ContextDialer).DialContext,},}
4. Colly dengan proxy
Colly adalah framework scraping Go yang paling banyak dipakai. Pasang proxy lewat SetProxyFunc:
package mainimport ("fmt""net/http""net/url""github.com/gocolly/colly/v2")func main() {c := colly.NewCollector()proxyURL, _ := url.Parse("http://USERNAME-cc-ID:PASSWORD@proxy.waroengproxy.com:8000")c.SetProxyFunc(func(_ *http.Request) (*url.URL, error) {return proxyURL, nil})c.OnHTML("title", func(e *colly.HTMLElement) {fmt.Println("judul:", e.Text)})c.Visit("https://example.com")}
Colly secara bawaan memakai ulang koneksi. Di mode rotating, IP baru didapat saat koneksi baru dibuka. Kalau perlu IP berbeda di setiap halaman, matikan keep-alive:
c.WithTransport(&http.Transport{Proxy: http.ProxyURL(proxyURL),DisableKeepAlives: true,})
5. Sesi sticky
Tambahkan -s- dengan label unik dan -ttl- dengan durasi detik di username. Selama TTL berjalan, label yang sama keluar lewat IP yang sama. Cocok untuk alur login atau formulir bertahap.
// sesi sticky 10 menit, label pesanan42proxyURL, _ := url.Parse("http://USERNAME-cc-ID-s-pesanan42-ttl-600:PASSWORD@proxy.waroengproxy.com:8000")
- Label pakai huruf dan angka saja, tanpa tanda minus (tanda minus adalah pemisah di username).
- TTL berkisar 1 sampai 86.400 detik (24 jam), bawaan 60 detik.
- Penjelasan lengkap kapan memakai sticky ada di Sticky atau rotating.
6. Scraping paralel yang hemat kuota
Goroutine memudahkan request paralel, tapi tanpa kendali, 100 goroutine ke satu domain bisa membuatmu diblokir dan menghabiskan kuota. Beberapa tips:
- Batasi paralelisme dengan
semaphore(channel berbuffer) atauerrgroupdengan limit. Mulai dari 3–5 goroutine per domain. - Tambahkan jeda antar request ke domain yang sama. Pakai
time.Sleepatau token bucket. - Blokir resource yang tidak perlu. Kalau datanya di HTML, jangan muat gambar atau JS.
- Simpan hasil dan jangan mengambil ulang halaman yang belum berubah. Header
If-None-Match/If-Modified-Sincemenghemat bandwidth. - Cek
robots.txtdan patuhiCrawl-delaykalau ada.
// semaphore sederhana: maks 5 request paralelsem := make(chan struct{}, 5)for _, u := range urls {sem <- struct{}{}go func(url string) {defer func() { <-sem }()resp, _ := client.Get(url)// proses resp}(u)}
Estimasi kebutuhan GB sebelum mulai: kalau satu halaman rata-rata 200 KB dan kamu mengambil 1.000 halaman, itu sekitar 0,2 GB. Panduan lengkapnya ada di Berapa GB yang sebenarnya kamu butuhkan?.
Langkah selanjutnya
Kamu sudah bisa memakai proxy di Go lewat net/http dan Colly. Kalau butuh target lokasi yang lebih spesifik, misalnya kota atau ISP tertentu, baca Target negara, kota, sampai ISP. Untuk membuat daftar proxy dalam jumlah besar, pakai Generator proxy di dashboard.