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 문서로 시작하십시오.






