Colly + Redis 持久化:斷點(diǎn)續(xù)爬與分布式一步到位

2025-07-14 16:48 更新

進(jìn)程掛了數(shù)據(jù)全丟?單機(jī)內(nèi)存不夠?用 Redis 當(dāng)“硬盤”,已爬 URL、Cookie 永久保存,多臺(tái)機(jī)器共享同一份進(jìn)度!

一、示例:

編程獅課程頻道,保留斷點(diǎn)續(xù)爬能力:

package main


import (
    "log"


    "github.com/gocolly/colly/v2"
    "github.com/gocolly/colly/v2/queue"
    "github.com/gocolly/colly/v2/storage/redisstorage"
)


func main() {
    // 1. 你要爬的 URL 列表
    urls := []string{
        "http://m.o2fo.com/go",
        "http://m.o2fo.com/python",
        "http://m.o2fo.com/java",
    }


    // 2. Redis 連接信息(本地或云 Redis 均可)
    store := &redisstorage.Storage{
        Address:  "127.0.0.1:6379", // 換成你的 Redis 地址
        Password: "",               // 若有密碼填這里
        DB:       0,                // 使用默認(rèn) 0 號(hào)庫
        Prefix:   "w3cschool_crawler", // key 前綴,避免沖突
    }


    // 3. 創(chuàng)建收集器并把“家”安到 Redis
    c := colly.NewCollector()
    if err := c.SetStorage(store); err != nil {
        log.Fatal("連接 Redis 失?。?, err)
    }


    // 4. 清空上一次測(cè)試數(shù)據(jù)(正式上線可注釋掉)
    _ = store.Clear()


    // 5. 創(chuàng)建隊(duì)列:并發(fā) 3 線程 + Redis 持久化
    q, _ := queue.New(3, store)


    // 6. 打印 Cookie(驗(yàn)證登錄態(tài)是否持久)
    c.OnResponse(func(r *colly.Response) {
        log.Println("Cookies:", c.Cookies(r.Request.URL.String()))
    })


    // 7. 把 URL 壓進(jìn)隊(duì)列
    for _, u := range urls {
        _ = q.AddURL(u)
    }


    // 8. 啟動(dòng)隊(duì)列,自動(dòng)消費(fèi)
    q.Run(c)
}

二、3 步快速跑通

步驟 命令/操作 說明
① 啟動(dòng) Redis docker run -d -p 6379:6379 redis 本地或云服務(wù)器均可
② 安裝依賴 go get github.com/gocolly/colly/v2/... 一鍵拉取新版
③ 運(yùn)行 go run main.go 看到進(jìn)度與 Cookie 實(shí)時(shí)寫入 Redis

三、Redis 存儲(chǔ)到底存了什么?

使用 redis-cli 查看:

127.0.0.1:6379> keys w3cschool_crawler*
1) "w3cschool_crawler:visited_urls"
2) "w3cschool_crawler:cookies_https:m.o2fo.com"

  • visited_urls 記錄已爬鏈接,重啟后自動(dòng)跳過。
  • cookies_* 保存登錄態(tài),多臺(tái)機(jī)器共享同一份 Cookie。

四、常見問題速查

問題 原因 解決
connection refused Redis 沒啟動(dòng)或端口錯(cuò) docker ps 檢查 6379 是否監(jiān)聽
數(shù)據(jù)沒保存 忘記 SetStorage 確保 c.SetStorage(store) 已寫
想清空重來 一鍵清庫 store.Clear() 或 FLUSHDB

五、1 分鐘進(jìn)階:多臺(tái)機(jī)器共享進(jìn)度

  • Address 改成云 Redis(阿里云、騰訊云)。
  • 所有節(jié)點(diǎn)跑同一份代碼,自動(dòng)去重、共享 Cookie。
  • 擴(kuò)容只需再開一臺(tái)機(jī)器,零代碼改動(dòng)!
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)