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 分钟实验

  1. 打开 终端 → 新建 proxy.go
  2. 复制上方示例 → 把代理换成你本地可用的地址 → go run proxy.go
  3. 观察终端:每次请求代理不同,IP 已切换。
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号