codecamp

Colly 限速实战:给爬虫装上“安全油门”

爬得太快被封?用 Colly 的 LimitRule 一键限速:固定延迟 + 并发上限,像老司机一样稳!

一、示例:

编程狮首页,限制并发 2 线程、固定 3 秒延迟:

package main


import (
    "fmt"
    "time"


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


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


    // 2. 限速规则:并发 2 + 固定 3 秒延迟
    c.Limit(&colly.LimitRule{
        DomainGlob:  "*w3cschool*", // 仅对编程狮生效
        Parallelism: 2,             // 最多 2 个 goroutine
        Delay:       3 * time.Second, // 每次请求后固定等待 3 秒
    })


    // 3. 打印访问日志
    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()
}

运行效果(每 3 秒一条):

访问: https://www.w3cschool.cn/index0.html
(3 秒后)
访问: https://www.w3cschool.cn/index1.html
...

二、4 大参数速记表

参数 含义 推荐值
DomainGlob 作用域名,支持通配 "*w3cschool*"
Parallelism 最大并发线程数 1~3(小站) 5~10(大站)
Delay 固定延迟 1~5 秒
RandomDelay 随机延迟(0~n) 与 Delay 二选一

只需设置 DelayRandomDelay 任意一个,不要同时设

三、实战模板:直接套

// 固定 2 秒延迟,并发 4
c.Limit(&colly.LimitRule{
    DomainGlob:  "*",
    Parallelism: 4,
    Delay:       2 * time.Second,
})

四、常见问题 30 秒排查

症状 原因 解决
还是 429/503 延迟太短 把 Delay 调到 3~5 秒
爬得巨慢 并发太低 适当提高 Parallelism
日志刷屏 调试太吵 去掉 colly.Debugger

五、1 分钟动手实验

  1. 打开 终端 → 新建 rate.go
  2. 复制上方“中文注释”代码 → 运行。
  3. 观察终端:每条日志间隔 3 秒,爬虫稳如老狗。
Colly 随机延迟:让爬虫像真人一样“礼貌”访问
Colly + Redis 持久化:断点续爬与分布式一步到位
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }