W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
想在請求之間傳遞自定義數(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é)
場景 | 存什么 | 代碼示例 |
---|---|---|
列表 → 詳情 | 課程名 | 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) |
列表收集器把數(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)
})
坑 | 原因 | 解決 |
---|---|---|
取不到值 | 用錯收集器 | 確保 Ctx.Put 和 Ctx.Get 在同一收集器或正確傳遞 |
并發(fā)沖突 | 多個 goroutine 寫同一 key | 使用唯一 key 或加鎖 |
內(nèi)存泄露 | 大量數(shù)據(jù)塞 Ctx | 及時刪除或用外部存儲 |
ctx.go
。 Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: