Go에서 프록시 사용하기: HTTP Client & SDK 가이드

Go 언어에서 프록시를 사용하는 방법을 알아봅니다. net/http 클라이언트 설정, SOCKS5 프록시, ProxyHat Go SDK, 동시 스크래핑 패턴을 코드 예제와 함께 설명합니다.

Go에서 프록시 사용하기: HTTP Client & SDK 가이드

Go에서 프록시가 필요한 이유

Go는 뛰어난 동시성 지원과 컴파일 언어의 성능으로 대규모 스크래핑과 네트워크 도구에 인기 있는 선택입니다. 고루틴을 사용하면 수천 개의 동시 요청을 효율적으로 처리할 수 있습니다.

이 가이드에서는 Go에서 프록시를 사용하는 모든 방법을 다룹니다 — 기본 net/http 설정부터 ProxyHat Go SDK까지.

기본 HTTP 프록시 설정

Go의 표준 라이브러리 net/http로 프록시를 설정합니다:

package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    proxyURL, _ := url.Parse("http://user:pass@gate.proxyhat.com:8080")

    client := &http.Client{
        Transport: &http.Transport{
            Proxy: http.ProxyURL(proxyURL),
        },
    }

    resp, err := client.Get("https://example.com/products")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println("Status:", resp.StatusCode)
    fmt.Println(string(body[:500]))
}

SOCKS5 프록시

SOCKS5 프록시를 사용하려면 golang.org/x/net/proxy 패키지를 사용합니다:

package main

import (
    "fmt"
    "io"
    "net/http"
    "golang.org/x/net/proxy"
)

func main() {
    dialer, err := proxy.SOCKS5("tcp", "gate.proxyhat.com:1080",
        &proxy.Auth{User: "user", Password: "pass"}, proxy.Direct)
    if err != nil {
        panic(err)
    }

    client := &http.Client{
        Transport: &http.Transport{
            Dial: dialer.Dial,
        },
    }

    resp, err := client.Get("https://example.com")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println("Status:", resp.StatusCode)
    fmt.Println(string(body[:500]))
}

ProxyHat Go SDK

ProxyHat Go SDK로 프록시 관리를 간소화합니다:

package main

import (
    "fmt"
    "github.com/ProxyHatCom/go-sdk/proxyhat"
)

func main() {
    client := proxyhat.NewClient("your_api_key")

    // 로테이팅 레지덴셜 프록시
    resp, err := client.Get("https://example.com/products", &proxyhat.Options{
        ProxyType: "residential",
        Country:   "US",
    })
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    fmt.Println("Status:", resp.StatusCode)
}

동시 스크래핑

Go의 고루틴으로 동시 스크래핑을 구현합니다:

package main

import (
    "fmt"
    "net/http"
    "net/url"
    "sync"
)

func main() {
    proxyURL, _ := url.Parse("http://user:pass@gate.proxyhat.com:8080")
    client := &http.Client{
        Transport: &http.Transport{
            Proxy: http.ProxyURL(proxyURL),
        },
    }

    urls := make([]string, 100)
    for i := range urls {
        urls[i] = fmt.Sprintf("https://example.com/product/%d", i+1)
    }

    // 세마포어로 동시성 제한
    sem := make(chan struct{}, 10)
    var wg sync.WaitGroup

    for _, u := range urls {
        wg.Add(1)
        go func(url string) {
            defer wg.Done()
            sem <- struct{}{}
            defer func() { <-sem }()

            resp, err := client.Get(url)
            if err != nil {
                fmt.Printf("오류: %s - %v\n", url, err)
                return
            }
            resp.Body.Close()
            fmt.Printf("성공: %s - %d\n", url, resp.StatusCode)
        }(u)
    }
    wg.Wait()
}

오류 처리와 재시도

func scrapeWithRetry(client *http.Client, url string, maxRetries int) (*http.Response, error) {
    for attempt := 0; attempt < maxRetries; attempt++ {
        resp, err := client.Get(url)
        if err == nil && resp.StatusCode == 200 {
            return resp, nil
        }
        if resp != nil {
            resp.Body.Close()
        }
        time.Sleep(time.Duration(1<<attempt) * time.Second)
    }
    return nil, fmt.Errorf("%d회 시도 후 실패: %s", maxRetries, url)
}

모범 사례

  • 커넥션 풀링 — http.Transport의 MaxIdleConns와 MaxConnsPerHost를 적절히 설정하십시오.
  • 타임아웃 — http.Client의 Timeout 필드를 설정하십시오.
  • 고루틴 제한 — 세마포어 패턴으로 동시 고루틴 수를 제한하십시오.
  • 리소스 정리 — 모든 응답의 Body를 반드시 Close하십시오.
  • context 사용 — context.WithTimeout으로 요청에 타임아웃을 설정하십시오.

핵심 요약

  • Go의 net/http는 Transport.Proxy로 HTTP 프록시를 기본 지원합니다.
  • SOCKS5 프록시는 golang.org/x/net/proxy 패키지로 사용할 수 있습니다.
  • ProxyHat Go SDK는 자동 로테이션과 간편한 프록시 관리를 제공합니다.
  • 고루틴과 세마포어 패턴으로 효율적인 동시 스크래핑을 구현하십시오.
  • ProxyHat 게이트웨이: gate.proxyhat.com, HTTP: 8080, SOCKS5: 1080.

Go 스크래핑을 시작하시겠습니까? ProxyHat 요금제를 확인하고 API 문서로 시작하십시오.

시작할 준비가 되셨나요?

AI 필터링으로 148개국 이상에서 5천만 개 이상의 레지덴셜 IP에 액세스하세요.

가격 보기레지덴셜 프록시
← 블로그로 돌아가기