Colly 請求上下文:讓爬蟲數(shù)據(jù)“隨身攜帶”

2025-07-14 16:54 更新

想在請求之間傳遞自定義數(shù)據(jù)?用 Ctx.Put / Ctx.Get 就像給每個請求發(fā)一張“身份證”,URL、標(biāo)題、分類隨用隨??!

一、示例:

編程獅課程頻道,并攜帶課程分類:

package main


import (
    "fmt"


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


func main() {
    c := colly.NewCollector()


    // 1. 請求前把分類寫進(jìn)上下文
    c.OnRequest(func(r *colly.Request) {
        // 假設(shè)我們手動給不同課程加分類
        r.Ctx.Put("category", "Go語言")
        r.Ctx.Put("url", r.URL.String())
    })


    // 2. 響應(yīng)后取出上下文里的數(shù)據(jù)
    c.OnResponse(func(r *colly.Response) {
        category := r.Ctx.Get("category")
        url      := r.Ctx.Get("url")
        fmt.Printf("分類[%s] → 地址[%s] 已抓取 %d 字節(jié)\n",
            category, url, len(r.Body))
    })


    // 3. 開始爬取
    c.Visit("http://m.o2fo.com/go")
}

運(yùn)行結(jié)果:

分類[Go語言] → 地址[http://m.o2fo.com/go] 已抓取 12345 字節(jié)

二、3 個典型使用場景

場景 存什么 代碼示例
列表 → 詳情 課程名 r.Ctx.Put("title", e.Text)
分布統(tǒng)計 爬蟲節(jié)點(diǎn)編號 r.Ctx.Put("node", "worker-3")
登錄狀態(tài) Token r.Ctx.Put("jwt", token)

三、進(jìn)階:多收集器共享上下文

列表收集器把數(shù)據(jù)傳給詳情收集器:

listC := colly.NewCollector()
detailC := colly.NewCollector()


// 列表收集器:拿到鏈接后附帶標(biāo)題
listC.OnHTML("a.course", func(e *colly.HTMLElement) {
    ctx := colly.NewContext()
    ctx.Put("title", e.Text)
    detailC.Request("GET", e.Attr("href"), nil, ctx, nil)
})


// 詳情收集器:讀取標(biāo)題
detailC.OnHTML("h1", func(e *colly.HTMLElement) {
    title := e.Request.Ctx.Get("title")
    fmt.Println("課程標(biāo)題:", title)
})

四、常見坑 30 秒排查

原因 解決
取不到值 用錯收集器 確保 Ctx.Put 和 Ctx.Get 在同一收集器或正確傳遞
并發(fā)沖突 多個 goroutine 寫同一 key 使用唯一 key 或加鎖
內(nèi)存泄露 大量數(shù)據(jù)塞 Ctx 及時刪除或用外部存儲

五、1 分鐘動手實驗

  1. 打開 終端 → 新建 ctx.go
  2. 復(fù)制上方“中文注釋”代碼 → 運(yùn)行。
  3. 觀察終端:URL 和分類被一起打印,數(shù)據(jù)“隨身攜帶”。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號