Colly 随机延迟:让爬虫像真人一样“礼貌”访问

2025-07-14 15:29 更新

把固定 Delay 换成 随机抖动,既降速防封,又更难被检测到。5 行代码即可启用!

一、示例:

编程狮首页,并加入 1~5 秒随机延迟:

package main


import (
    "fmt"
    "time"


    "github.com/gocolly/colly/v2"
    "github.com/gocolly/colly/v2/debug"
)


func main() {
    // 1. 创建收集器:开调试 + 开异步
    c := colly.NewCollector(
        colly.Debugger(&debug.LogDebugger{}), // 终端实时日志
        colly.Async(true),                    // 并发
    )


    // 2. 限速规则:并发 2 线程 + 随机 1~5 秒延迟
    c.Limit(&colly.LimitRule{
        DomainGlob:  "*w3cschool*", // 仅对编程狮域名生效
        Parallelism: 2,             // 最多 2 个 goroutine
        RandomDelay: 5 * time.Second, // 0~5 秒随机等待
    })


    // 3. 打印每次访问的 URL(方便观察延迟效果)
    c.OnRequest(func(r *colly.Request) {
        fmt.Println("开始访问:", r.URL.String())
    })


    // 4. 连续访问 5 个页面
    for i := 0; i < 5; i++ {
        c.Visit(fmt.Sprintf("https://www.w3cschool.cn/index%d.html", i))
    }


    // 5. 等待所有任务完成
    c.Wait()
}

运行效果(每次间隔不同):

开始访问: https://www.w3cschool.cn/index0.html
开始访问: https://www.w3cschool.cn/index1.html
(1.2 秒后)
开始访问: https://www.w3cschool.cn/index2.html
(4.5 秒后)
...

二、3 个核心参数速记

参数 含义 推荐值
Parallelism 同时并发线程数 1~8(根据目标站承受力)
RandomDelay 最大随机等待时间 1~5 秒常见
Delay 固定等待(可选) 与 RandomDelay 二选一

同时设置 DelayRandomDelay 时,后者生效

三、实战模板:直接套用

c.Limit(&colly.LimitRule{
    DomainGlob:  "*",               // 全网生效
    Parallelism: 3,                 // 3 线程
    RandomDelay: 3 * time.Second,   // 0~3 秒随机
})

四、常见问题速答

问题 原因 解决
还是被封 延迟太短/并发太高 把 RandomDelay 调到 5~10 秒,并降低 Parallelism
日志太多 调试太吵 去掉 colly.Debugger(&debug.LogDebugger{})
想固定 1 秒起步 使用 Delay + RandomDelay Delay: 1*time.Second 再叠加随机

五、1 分钟动手实验

  1. 打开 终端 → 新建 delay.go
  2. 复制上方“中文注释”代码 → 运行。
  3. 观察终端:每条日志间隔随机,爬虫像真人点击一样“礼貌”。
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号