Proxies in Go verwenden: HTTP Client & SDK Anleitung

Erfahren Sie, wie Sie Proxies in Go mithilfe von net/http und dem ProxyHat Go SDK konfigurieren. Covers Authentifizierung, Rotation, Geo-Targeting, Goroutine Koncurrency und Produktionsbest Practices.

Proxies in Go verwenden: HTTP Client & SDK Anleitung

Warum Proxies in Go verwenden?

Go ist die Sprache der Wahl für Hochleistungs-Netzwerk-Tools, Web-Schrotter und API-Clients geworden. Seine leichten Goroutinen, eingebaute Konkurrenzprimitiven und ein Schlachttest net/http Standard-Bibliothek machen es ideal für proxy-powered-Anwendungen, die Tausende von gleichzeitigen Anfragen bewältigen müssen.

Ob Sie ein Bahnschrott Pipeline, Überwachung SERP Rankings, oder das Sammeln von konkurrenzfähigen Preisdaten, das Routing Ihrer Go HTTP-Clients durch Proxies ermöglicht es Ihnen, IP-Adressen zu drehen, Geo-Beschränkungen zu umgehen und Ratenlimits im Maßstab zu vermeiden.

In dieser Anleitung erfahren Sie, wie Sie konfigurieren Proxies in Go sowohl die Standardbibliothek als auch die ProxyHat gehen SDKJeder Code-Schnipsel ist Kopier-Pasta-ready, so dass Sie innerhalb von Minuten mit dem Abkratzen beginnen können.

Installation

ProxyHat gehen SDK

Der schnellste Weg zum Start ist mit dem offiziellen SDK. Es behandelt Authentifizierung, Rotation, Geo-Targeting und retries aus der Box.

go get github.com/ProxyHatCom/go-sdk@latest

Nur Standardbibliothek

Wenn Sie keine Abhängigkeiten bevorzugen, Go's net/http und net/url Pakete sind alles, was Sie brauchen. Keine zusätzliche Installation erforderlich.

Authentication und Basic Setup

ProxyHat verwendet Benutzername-Passwort-Authentifizierung über den Proxy-Endpunkt. Sie finden Ihre Anmeldeinformationen in der ProxyHat dashboardEine typische Proxy-URL sieht so aus:

http://USERNAME:PASSWORD@gate.proxyhat.com:8080

Halten Sie Anmeldeinformationen aus Quellcode. Verwendung von Umgebungsvariablen oder .env Datei:

export PROXYHAT_USER="your_username"
export PROXYHAT_PASS="your_password"

Einfaches GET Anfrage mit einem Proxy

Hier ist der minimale Ansatz mit nur der Standardbibliothek:

package main
import (
    "fmt"
    "io"
    "log"
    "net/http"
    "net/url"
    "os"
)
func main() {
    proxyURL, err := url.Parse(fmt.Sprintf(
        "http://%s:%s@gate.proxyhat.com:8080",
        os.Getenv("PROXYHAT_USER"),
        os.Getenv("PROXYHAT_PASS"),
    ))
    if err != nil {
        log.Fatal(err)
    }
    client := &http.Client{
        Transport: &http.Transport{
            Proxy: http.ProxyURL(proxyURL),
        },
    }
    resp, err := client.Get("https://httpbin.org/ip")
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}

Führen Sie es aus und Sie werden eine Wohn-IP-Adresse anstelle Ihrer eigenen sehen. Jede Anfrage wird durch ProxyHat's geleitet Wohn-Proxy-Pool.

Verwendung verschiedener Proxy-Typen

ProxyHat unterstützt drei Proxytypen, die jeweils für unterschiedliche Workloads geeignet sind. Sie wählen den Typ über den Proxy-Port oder eine Benutzername-Flag:

Verwendung verschiedener Proxy-Typen
TypHafenDas Beste fürNicht auf Lager
Wohngebiet8000Web-Schrott, Anzeigenverifikation~800 ms
Datencenter8010Hochgeschwindigkeits-Pulveranfragen~200 ms
Mobil8020Social Media, App-Tests~1200 ms

Für einen tieferen Vergleich, wann jeder Typ verwendet werden soll, siehe unsere Anleitung auf Wohnen vs datacenter vs mobile proxies.

// Switch proxy type by changing the port
residentialProxy := "http://user:pass@gate.proxyhat.com:8080"
datacenterProxy  := "http://user:pass@gate.proxyhat.com:8080"
mobileProxy      := "http://user:pass@gate.proxyhat.com:8080"

Manueller Ansatz: Gehen Sie net/http mit Proxy Konfiguration

Für die volle Kontrolle, konfigurieren Sie die http.Transport direkt. Damit können Sie die Verbindung Pooling, TLS-Einstellungen und Timeouts abstimmen:

package main
import (
    "crypto/tls"
    "net/http"
    "net/url"
    "time"
)
func newProxyClient(proxyAddr string) (*http.Client, error) {
    proxyURL, err := url.Parse(proxyAddr)
    if err != nil {
        return nil, err
    }
    transport := &http.Transport{
        Proxy:               http.ProxyURL(proxyURL),
        MaxIdleConns:        100,
        MaxIdleConnsPerHost: 10,
        IdleConnTimeout:     90 * time.Second,
        TLSClientConfig:     &tls.Config{MinVersion: tls.VersionTLS12},
    }
    client := &http.Client{
        Transport: transport,
        Timeout:   30 * time.Second,
    }
    return client, nil
}

Empfohlene Vorgehensweise: ProxyHat Go SDK

Die ProxyHat gehen SDK wickelt alle Kesselplatte in eine saubere API. Es verwaltet Verbindungspooling, automatische Retries, Session Handling und Geo-Targeting für Sie.

package main
import (
    "context"
    "fmt"
    "log"
    proxyhat "github.com/ProxyHatCom/go-sdk"
)
func main() {
    client, err := proxyhat.NewClient(proxyhat.Config{
        Username:  "your_username",
        Password:  "your_password",
        ProxyType: proxyhat.Residential,
    })
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()
    resp, err := client.Get(context.Background(), "https://httpbin.org/ip")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Status:", resp.StatusCode)
    fmt.Println("Body:", string(resp.Body))
}

Das SDK gibt eine strukturierte Antwort zurück, behandelt Dekompression und retries transiente Fehler automatisch. Überprüfen Sie die API-Dokumentation für die vollständige Methode Referenz.

Rotating vs Sticky Sessions

ProxyHat unterstützt zwei Sitzungsmodi:

  • Drehen (Standard) — jede Anfrage erhält eine neue IP. Ideal für Großserien Bahnschrott.
  • Stickerei — das gleiche IP wird für eine konfigurierbare Dauer (bis zu 30 Minuten) gehalten. Nützlich für mehrstufige Ströme wie Login-Sequenzen oder paginierte Crawls.

Rotierende Sitzungen (SDK)

client, _ := proxyhat.NewClient(proxyhat.Config{
    Username:  "your_username",
    Password:  "your_password",
    ProxyType: proxyhat.Residential,
    // Rotating is the default — no extra config needed
})
// Each call uses a different IP
for i := 0; i < 5; i++ {
    resp, _ := client.Get(context.Background(), "https://httpbin.org/ip")
    fmt.Printf("Request %d: %s\n", i+1, string(resp.Body))
}

Sticky Sessions (SDK)

session, _ := client.NewSession(proxyhat.SessionConfig{
    Duration: 10 * time.Minute,
})
// All requests through this session use the same IP
resp1, _ := session.Get(context.Background(), "https://example.com/login")
resp2, _ := session.Post(context.Background(), "https://example.com/dashboard", payload)

Sticky Sessions (manuell)

// Append session ID to the username
// Format: USERNAME-session-SESSIONID
proxyURL := "http://user-session-abc123:pass@gate.proxyhat.com:8080"

Geo-Targeted Anfragen

Brauchen Sie IPs aus einem bestimmten Land? ProxyHat unterstützt 190+ Standorte. Passen Sie den Ländercode über das SDK oder als Benutzername-Flag:

// SDK approach
client, _ := proxyhat.NewClient(proxyhat.Config{
    Username:  "your_username",
    Password:  "your_password",
    ProxyType: proxyhat.Residential,
    Country:   "US",   // ISO 3166-1 alpha-2
    State:     "CA",   // optional: state/region
    City:      "LA",   // optional: city
})
resp, _ := client.Get(context.Background(), "https://httpbin.org/ip")
fmt.Println(string(resp.Body)) // US-based IP
// Manual approach — append country to username
// Format: USERNAME-country-US
proxyURL := "http://user-country-US:pass@gate.proxyhat.com:8080"

Geo-Targeting ist für lokalisierte SERP-Tracking, regionale Preisprüfungen und die Prüfung der Inhaltsverfügbarkeit.

Fehlerbehandlung und Retries

Netzwerkanfragen durch Proxies können aus transienten Gründen scheitern: Verbindungsrückstellungen, Timeouts oder temporäre Blöcke. Für Produktionsabstreifer ist eine robuste Fehlerbehandlung entscheidend.

SDK eingebaute Retries

client, _ := proxyhat.NewClient(proxyhat.Config{
    Username:   "your_username",
    Password:   "your_password",
    ProxyType:  proxyhat.Residential,
    MaxRetries: 3,
    RetryDelay: 2 * time.Second,
})

Manuelle Retry mit exponentiellem Backoff

package main
import (
    "fmt"
    "math"
    "net/http"
    "time"
)
func fetchWithRetry(client *http.Client, url string, maxRetries int) (*http.Response, error) {
    var lastErr error
    for attempt := 0; attempt <= maxRetries; attempt++ {
        resp, err := client.Get(url)
        if err == nil && resp.StatusCode < 500 {
            return resp, nil
        }
        if err != nil {
            lastErr = err
        } else {
            lastErr = fmt.Errorf("HTTP %d", resp.StatusCode)
            resp.Body.Close()
        }
        backoff := time.Duration(math.Pow(2, float64(attempt))) * time.Second
        time.Sleep(backoff)
    }
    return nil, fmt.Errorf("all %d retries failed: %w", maxRetries, lastErr)
}

Concurrent Scraping mit Goroutines

Gos Konkurrenzmodell ist seine Supermacht. Mit Goroutinen und Kanälen können Sie Hunderte von URLs gleichzeitig abkratzen, während die Speichernutzung minimal bleibt.

package main
import (
    "context"
    "fmt"
    "sync"
    proxyhat "github.com/ProxyHatCom/go-sdk"
)
type Result struct {
    URL        string
    StatusCode int
    Body       string
    Err        error
}
func scrape(ctx context.Context, client *proxyhat.Client, urls []string, concurrency int) []Result {
    results := make([]Result, len(urls))
    sem := make(chan struct{}, concurrency) // semaphore
    var wg sync.WaitGroup
    for i, u := range urls {
        wg.Add(1)
        go func(idx int, target string) {
            defer wg.Done()
            sem <- struct{}{}        // acquire
            defer func() { <-sem }() // release
            resp, err := client.Get(ctx, target)
            if err != nil {
                results[idx] = Result{URL: target, Err: err}
                return
            }
            results[idx] = Result{
                URL:        target,
                StatusCode: resp.StatusCode,
                Body:       string(resp.Body),
            }
        }(i, u)
    }
    wg.Wait()
    return results
}
func main() {
    client, _ := proxyhat.NewClient(proxyhat.Config{
        Username:  "your_username",
        Password:  "your_password",
        ProxyType: proxyhat.Residential,
    })
    defer client.Close()
    urls := []string{
        "https://example.com/page/1",
        "https://example.com/page/2",
        "https://example.com/page/3",
        // ... hundreds more
    }
    results := scrape(context.Background(), client, urls, 20)
    for _, r := range results {
        if r.Err != nil {
            fmt.Printf("FAIL %s: %v\n", r.URL, r.Err)
        } else {
            fmt.Printf("OK   %s: %d bytes\n", r.URL, len(r.Body))
        }
    }
}

Beschränkung mit Semaphore

Der vorstehende Abstreifer verwendet bereits einen semaphoren Kanal, um Konkurs zu kappen. Für eine feinerkörnige Ratenbegrenzung (z.B. N Anfragen pro Sekunde) verwenden golang.org/x/time/rate:

package main
import (
    "context"
    "fmt"
    "log"
    proxyhat "github.com/ProxyHatCom/go-sdk"
    "golang.org/x/time/rate"
)
func main() {
    client, _ := proxyhat.NewClient(proxyhat.Config{
        Username:  "your_username",
        Password:  "your_password",
        ProxyType: proxyhat.Residential,
    })
    defer client.Close()
    // Allow 10 requests per second, burst of 20
    limiter := rate.NewLimiter(10, 20)
    urls := []string{"https://example.com/1", "https://example.com/2"}
    for _, u := range urls {
        if err := limiter.Wait(context.Background()); err != nil {
            log.Fatal(err)
        }
        resp, err := client.Get(context.Background(), u)
        if err != nil {
            fmt.Printf("Error: %v\n", err)
            continue
        }
        fmt.Printf("%s — %d\n", u, resp.StatusCode)
    }
}

Produktionstipps

Anschluss Pooling

Los. http.Transport hält standardmäßig einen Pool von Leeranschlüssen aufrecht. Für Proxy-Workloads stimmen Sie diese Einstellungen ab:

transport := &http.Transport{
    Proxy:                 http.ProxyURL(proxyURL),
    MaxIdleConns:          200,
    MaxIdleConnsPerHost:   50,
    MaxConnsPerHost:       100,
    IdleConnTimeout:       90 * time.Second,
    ResponseHeaderTimeout: 15 * time.Second,
}

Timeouts

Setzen Sie immer Zeitausflüge. Ein Abstreifer ohne Timeouts wird schließlich an einer gestaffelten Verbindung hängen:

client := &http.Client{
    Transport: transport,
    Timeout:   30 * time.Second, // total request timeout
}
// Or use context for per-request control
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", targetURL, nil)
resp, err := client.Do(req)

Anmutige Stilllegung

Bei langanhaltenden Schabern hören Sie, dass OS-Signale sauber abschalten:

package main
import (
    "context"
    "os"
    "os/signal"
    "syscall"
)
func main() {
    ctx, stop := signal.NotifyContext(
        context.Background(),
        os.Interrupt, syscall.SIGTERM,
    )
    defer stop()
    // Pass ctx to your scraping functions
    // When Ctrl+C is pressed, ctx is cancelled
    // and in-flight requests wind down gracefully
    runScraper(ctx)
}

Protokollierung und Einhaltung

Wrap your HTTP transport to log Request Timing and status codes. Dies hilft, langsame Ziele und Proxyfehler in der Produktion zu identifizieren:

type loggingTransport struct {
    inner http.RoundTripper
}
func (t *loggingTransport) RoundTrip(req *http.Request) (*http.Response, error) {
    start := time.Now()
    resp, err := t.inner.RoundTrip(req)
    elapsed := time.Since(start)
    if err != nil {
        log.Printf("ERR  %s %s (%v) err=%v", req.Method, req.URL, elapsed, err)
    } else {
        log.Printf("OK   %s %s (%v) status=%d", req.Method, req.URL, elapsed, resp.StatusCode)
    }
    return resp, err
}

Schlüsselanhänger

  • Go's goroutines + proxies = massive Konkurrenz. Sie können Tausende von proxy-geleiteten Anfragen mit minimalem Speicher Overhead ausführen.
  • Die ProxyHat Go SDK behandelt Authentifizierung, Retries, Sitzungen und Geo-Targeting mit einer sauberen API. Installieren Sie es die Kesselplatte überspringen.
  • Verwenden Sie rotierende IPs zum Abkratzen im Maßstab und klebrigen Sitzungen für mehrstufige Workflows wie Login-Flows.
  • Immer Zeitausflüge einstellen auf beiden http.Client und über context.WithTimeout für per-Request-Kontrolle.
  • Ratenlimit verantwortungsvoll mit golang.org/x/time/rate und Kappe Konkurrenz mit semaphore Kanäle.
  • Geotarget Ihre Anfragen durch Übergeben eines Ländercodes zum Zugriff 190+ Standorte weltweit.
  • Überprüfen Sie unseren Führer auf der Best-Proxis für Web-Schrott den richtigen Plan für Ihre Arbeitsbelastung zu wählen.

Häufig gestellte Fragen

Wie konfiguriere ich einen Proxy in Gos net/http Client?

Setzen Sie die Proxy Feld auf http.Transport bis http.ProxyURL(parsedURL) wenn parsedURL ist Ihre Proxy-Adresse mit url.Parse(). Dann passieren Sie den Transport zu http.Client. Die Standardbibliothek behandelt die CONNECT Tunneling für HTTPS-Ziele automatisch.

Unterstützt das ProxyHat Go SDK HTTPS-Ziele?

Ja. Das SDK verwendet HTTP CONNECT Tunneling unter der Haube, so dass jeder HTTPS-Verkehr zwischen Ihrem Client und dem Zielserver verschlüsselt ist. Der Proxy sieht nur den Ziel-Hostnamen.

Wie viele gleichzeitige Anfragen kann ich durch Go-Proxies machen?

Go's Goroutines sind extrem leicht (etwa 4 KB Stapel pro), so dass Sie Zehntausende gleichzeitig ausführen können. Die praktische Grenze ist Ihr ProxyHat Plan gleichzeitiger Verbindungszuschlag und die Kapazität des Zielservers. Verwenden Sie einen semaphore Kanal, um Konkurrenz auf einem sicheren Niveau zu kappen.

Was ist der Unterschied zwischen rotierenden und klebrigen Proxy-Sitzungen?

Rotierende Sitzungen geben jeder Anfrage eine neue IP-Adresse zu, die ideal für breites Abkratzen ist. Sticky-Sitzungen halten die gleiche IP für eine eingestellte Dauer (bis zu 30 Minuten), so dass sie geeignet für mehrstufige Ströme, wo das Ziel erwartet einen konsistenten Besucher, wie Login-Sequenzen oder Checkout-Seiten.

Wie behandle ich Proxy-Fehler und Retries in Go?

Die ProxyHat Go SDK bietet integrierte Retry-Logik mit konfigurierbar MaxRetries und RetryDelayWenn Sie die Standard-Bibliothek verwenden, implementieren Sie exponentielle Backoff, indem Sie Ihre Anfrage in einer Schleife, die die Verzögerung nach jedem gescheiterten Versuch verdoppelt. Überprüfen Sie immer beide Netzwerkfehler und HTTP 5xx Statuscodes.

Bereit loszulegen?

Zugang zu über 50 Mio. Residential-IPs in über 148 Ländern mit KI-gesteuerter Filterung.

Preise ansehenResidential Proxies
← Zurück zum Blog