Colly 代理轮询:自动切换 IP 防封实战
2025-07-14 11:04 更新
单 IP 被封?用 Colly 官方
proxy.RoundRobinProxySwitcher
,一行代码实现多代理轮询,轻松伪装成“千军万马”。
一、示例:
爬 编程狮首页,并通过 2 个本地代理轮流访问:
package main
import (
"log"
"time"
"github.com/gocolly/colly/v2"
"github.com/gocolly/colly/v2/proxy"
)
func main() {
// 创建收集器,允许重复访问同一 URL
c := colly.NewCollector(
colly.AllowURLRevisit(),
colly.AllowedDomains("www.w3cschool.cn"),
)
// 1. 设置代理池(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("代理设置失败:", err)
}
c.SetProxyFunc(rp)
// 2. 打印每次使用的代理和返回内容
c.OnResponse(func(r *colly.Response) {
log.Printf("代理:%s | 返回长度:%d 字节 | URL:%s",
r.Request.ProxyURL, len(r.Body), r.Request.URL)
})
// 3. 连续访问 5 次,观察 IP 轮换
for i := 0; i < 5; i++ {
c.Visit("https://www.w3cschool.cn/")
time.Sleep(1 * time.Second) // 避免太快
}
}
二、3 步快速体验
步骤 | 操作 | 说明 |
---|---|---|
① 启动代理 | 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) |
速度慢 | 代理带宽低 | 换更高带宽节点或增加代理数 |
五、1 分钟实验
- 打开 终端 → 新建
proxy.go
。 - 复制上方示例 → 把代理换成你本地可用的地址 →
go run proxy.go
。 - 观察终端:每次请求代理不同,IP 已切换。
以上内容是否对您有帮助:
更多建议: