Panduan3 menit baca

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.

Python
package main
import (
"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:

Contoh
# Linux / macOS
export 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_PROXY
go 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.

Python
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,
},
}
Perbandingan lengkap HTTP vs SOCKS5 ada di HTTP, HTTPS, atau SOCKS5?. Untuk kebanyakan scraping, proxy HTTP sudah cukup.

4. Colly dengan proxy

Colly adalah framework scraping Go yang paling banyak dipakai. Pasang proxy lewat SetProxyFunc:

Python
package main
import (
"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:

Contoh
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.

Contoh
// sesi sticky 10 menit, label pesanan42
proxyURL, _ := 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) atau errgroup dengan limit. Mulai dari 3–5 goroutine per domain.
  • Tambahkan jeda antar request ke domain yang sama. Pakai time.Sleep atau 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-Since menghemat bandwidth.
  • Cek robots.txt dan patuhi Crawl-delay kalau ada.
Contoh
// semaphore sederhana: maks 5 request paralel
sem := 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.