

این راهنما به شما نشان میدهد چگونه پروکسیها را با کتابخانه Go Colly در پروژههای وب اسکریپینگ استفاده و مدیریت کنید. اگرچه مثالها با زبان Go نوشته شدهاند، مفاهیم برای توسعهدهندگان دیگر زبانها (مثل Python) نیز قابلانتقال است. در پایان این مقاله خواهید دانست که چگونه پروکسی ساده تنظیم کنید، با پروکسیهای دارای احراز هویت کار کنید، لیست پروکسیها را بچرخانید، از دروازههای پروکسی و APIهای پروکسی استفاده کنید و نکات عملی برای پایدارسازی و امنسازی اسکریپر را پیادهسازی کنید.
برای افزودن یک پروکسی ساده کافی است روی کالکتر SetProxy را فراخوانی کنید. مثال کوتاه زیر یک درخواست میفرستد و پاسخ را چاپ میکند.
package main
import (
"bytes"
"log"
"github.com/gocolly/colly"
)
func main() {
// Instantiate default collector
c := colly.NewCollector(colly.AllowURLRevisit())
// Set Proxy
c.SetProxy("http://proxy.example.com:8080")
// Print the Response
c.OnResponse(func(r *colly.Response) {
log.Printf("%s\n", bytes.Replace(r.Body, []byte("\\n"), nil, -1))
})
// On Error Print Error
c.OnError(func(_ *colly.Response, err error) {
log.Println("Something went wrong:", err)
})
// Request Page
c.Visit("https://httpbin.org/ip")
}
توضیح کد:
نکته: این روش برای درخواستهای GET/POST/PUT/... که Colly پشتیبانی میکند مناسب است. اما اگر نیاز به چرخش پروکسی یا مدیریت وضعیت پروکسیها دارید، روشهای بعدی را ببینید.
برای پروکسیهایی که نیاز به username و password دارند، کافیست آنها را در رشتهٔ پروکسی بگنجانید:
package main
import (
"bytes"
"log"
"github.com/gocolly/colly"
)
func main() {
c := colly.NewCollector(colly.AllowURLRevisit())
// Proxy with basic auth credentials
c.SetProxy("http://USERNAME:PASSWORD@proxy.example.com:8080")
c.OnResponse(func(r *colly.Response) {
log.Printf("%s\n", bytes.Replace(r.Body, []byte("\\n"), nil, -1))
})
c.OnError(func(_ *colly.Response, err error) {
log.Println("Something went wrong:", err)
})
c.Visit("https://httpbin.org/ip")
}
نکات امنیتی و عملی:
سه فرمت متداول پروکسی که امروزه ارائه میشوند عبارتاند از:
اگر تامینکنندهتان یک لیست پروکسی میدهد، سادهترین روش استفاده از proxy.RoundRobinProxySwitcher در بستهٔ Colly است. ابتدا بستهٔ پروکسی را نصب کنید:
go get github.com/gocolly/colly/proxy
نمونهٔ کد چرخش ساده:
package main
import (
"bytes"
"log"
"github.com/gocolly/colly"
"github.com/gocolly/colly/proxy"
)
func main() {
c := colly.NewCollector(colly.AllowURLRevisit())
proxyList := []string{
"http://Username:Password@85.237.57.198:20000",
"http://Username:Password@85.237.57.198:21000",
"http://Username:Password@85.237.57.198:22000",
"http://Username:Password@85.237.57.198:23000",
}
rp, err := proxy.RoundRobinProxySwitcher(proxyList...)
if err != nil {
log.Fatal(err)
}
// Use proxy switcher function
c.SetProxyFunc(rp)
c.OnResponse(func(r *colly.Response) {
log.Printf("%s\n", bytes.Replace(r.Body, []byte("\\n"), nil, -1))
})
c.OnError(func(_ *colly.Response, err error) {
log.Println("Something went wrong:", err)
})
for i := 0; i < 5; i++ {
c.Visit("https://httpbin.org/ip")
}
}
توضیح و نکات اجرایی:
در این مدل، تامینکننده یک endpoint واحد ارائه میکند که خودش ترافیک را به زیرمجموعهٔ پروکسیها هدایت میکند. کار شما صرفاً تنظیم یک پروکسی است. مثال زیر نشان میدهد چگونه از یک دروازهٔ مسکونی مانند BrightData استفاده کنید:
package main
import (
"bytes"
"log"
"github.com/gocolly/colly"
)
func main() {
c := colly.NewCollector(colly.AllowURLRevisit())
// Single gateway proxy
c.SetProxy("http://zproxy.lum-superproxy.io:22225")
c.OnResponse(func(r *colly.Response) {
log.Printf("%s\n", bytes.Replace(r.Body, []byte("\\n"), nil, -1))
})
c.OnError(func(_ *colly.Response, err error) {
log.Println("Something went wrong:", err)
})
c.Visit("https://httpbin.org/ip")
}
مزایا و معایب:
برخی تامینکنندگان APIهای هوشمند ارائه میدهند که شما آدرس هدف را به آنها میفرستید و آنها نتیجهٔ HTML را بازمیگردانند. نمونه زیر با ScrapeOps نشان میدهد چگونه پارامترها را URL-encode کنید و درخواست را ارسال نمایید.
package main
import (
"bytes"
"log"
"github.com/gocolly/colly"
"net/url"
)
func main() {
c := colly.NewCollector(colly.AllowURLRevisit())
c.OnResponse(func(r *colly.Response) {
log.Printf("%s\n", bytes.Replace(r.Body, []byte("\\n"), nil, -1))
})
c.OnError(func(_ *colly.Response, err error) {
log.Println("Something went wrong:", err)
})
// Build proxy API URL
u, err := url.Parse("https://proxy.scrapeops.io/v1/")
if err != nil {
log.Fatal(err)
}
q := u.Query()
q.Set("api_key", "YOUR_API_KEY") // از متغیر محیطی استفاده کنید
q.Set("url", "https://httpbin.org/ip")
u.RawQuery = q.Encode()
// Visit the full API URL
c.Visit(u.String())
}
نکات مهم:
در این مقاله سه روش اصلی ادغام پروکسی با Go Colly را دیدیم: تنظیم پروکسی ساده، چرخش با لیست پروکسی، استفاده از دروازه و استفاده از API پروکسی. هر روش مزایا و محدودیتهای خود را دارد؛ انتخاب مناسب بستگی به مقیاس، بودجه و نیاز به کنترل روی آیپیها دارد. مهمترین نکات عملی عبارتاند از مدیریت کلیدها بهصورت امن، پیادهسازی مانیتورینگ پروکسیها، کنترل نرخ و استراتژیهای retry. با پیادهسازی این راهکارها میتوانید یک اسکریپر پایدارتر و کمتر در معرض بلاک شدن بسازید.

