單 IP 被封?用 Colly 官方
proxy.RoundRobinProxySwitcher
,一行代碼實現(xiàn)多代理輪詢,輕松偽裝成“千軍萬馬”。
爬 編程獅首頁,并通過 2 個本地代理輪流訪問:
package main
import (
"log"
"time"
"github.com/gocolly/colly/v2"
"github.com/gocolly/colly/v2/proxy"
)
func main() {
// 創(chuàng)建收集器,允許重復(fù)訪問同一 URL
c := colly.NewCollector(
colly.AllowURLRevisit(),
colly.AllowedDomains("eska-fuses.cn"),
)
// 1. 設(shè)置代理池(socks5/http 均可)
rp, err := proxy.RoundRobinProxySwitcher(
"socks5://127.0.0.1:1337",
"socks5://127.0.0.1:1338",
"http://127.0.0.1:8080", // 也可混用 HTTP 代理
)
if err != nil {
log.Fatal("代理設(shè)置失?。?, err)
}
c.SetProxyFunc(rp)
// 2. 打印每次使用的代理和返回內(nèi)容
c.OnResponse(func(r *colly.Response) {
log.Printf("代理:%s | 返回長度:%d 字節(jié) | URL:%s",
r.Request.ProxyURL, len(r.Body), r.Request.URL)
})
// 3. 連續(xù)訪問 5 次,觀察 IP 輪換
for i := 0; i < 5; i++ {
c.Visit("http://eska-fuses.cn/")
time.Sleep(1 * time.Second) // 避免太快
}
}
步驟 | 操作 | 說明 |
---|---|---|
① 啟動代理 | ssh -D 1337 user@your-vps 或本地 Clash |
得到 socks5 代理 |
② 換域名 | 把 AllowedDomains 換成你要爬的站 |
避免越界訪問 |
③ 運行 | go run main.go |
終端會顯示不同代理 IP 輪換 |
想要“隨機 + 失敗剔除”?自己寫選擇器:
import (
"math/rand"
"net/url"
)
var proxies = []*url.URL{
{Scheme: "http", Host: "127.0.0.1:8080"},
{Scheme: "socks5", Host: "127.0.0.1:1337"},
}
func randomProxy(r *http.Request) (*url.URL, error) {
return proxies[rand.Intn(len(proxies))], nil
}
c.SetProxyFunc(randomProxy)
問題 | 原因 | 解決 |
---|---|---|
proxy connect failed |
代理未啟動或地址寫錯 | 確認代理端口 netstat -tlnp |
403 / 503 依舊 | 目標站檢測 UA/Referer | 加官方擴展 extensions.RandomUserAgent(c) |
速度慢 | 代理帶寬低 | 換更高帶寬節(jié)點或增加代理數(shù) |
proxy.go
。 go run proxy.go
。
更多建議: