Colly 限速實戰(zhàn):給爬蟲裝上“安全油門”

2025-07-14 16:45 更新

爬得太快被封?用 Colly 的 LimitRule 一鍵限速:固定延遲 + 并發(fā)上限,像老司機一樣穩(wěn)!

一、示例:

編程獅首頁,限制并發(fā) 2 線程、固定 3 秒延遲:

package main


import (
    "fmt"
    "time"


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


func main() {
    // 1. 創(chuàng)建收集器:開異步 + 開調(diào)試
    c := colly.NewCollector(
        colly.Async(true),
        colly.Debugger(&debug.LogDebugger{}),
    )


    // 2. 限速規(guī)則:并發(fā) 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. 連續(xù)訪問 5 次
    for i := 0; i < 5; i++ {
        c.Visit(fmt.Sprintf("http://m.o2fo.com/index%d.html", i))
    }


    // 5. 等待全部完成
    c.Wait()
}

運行效果(每 3 秒一條):

訪問: http://m.o2fo.com/index0.html
(3 秒后)
訪問: http://m.o2fo.com/index1.html
...

二、4 大參數(shù)速記表

參數(shù) 含義 推薦值
DomainGlob 作用域名,支持通配 "*w3cschool*"
Parallelism 最大并發(fā)線程數(shù) 1~3(小站) 5~10(大站)
Delay 固定延遲 1~5 秒
RandomDelay 隨機延遲(0~n) 與 Delay 二選一

只需設(shè)置 DelayRandomDelay 任意一個,不要同時設(shè)。

三、實戰(zhàn)模板:直接套

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

四、常見問題 30 秒排查

癥狀 原因 解決
還是 429/503 延遲太短 把 Delay 調(diào)到 3~5 秒
爬得巨慢 并發(fā)太低 適當提高 Parallelism
日志刷屏 調(diào)試太吵 去掉 colly.Debugger

五、1 分鐘動手實驗

  1. 打開 終端 → 新建 rate.go。
  2. 復(fù)制上方“中文注釋”代碼 → 運行。
  3. 觀察終端:每條日志間隔 3 秒,爬蟲穩(wěn)如老狗。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號