Colly 存儲后端:給爬蟲數(shù)據(jù)安個“家”

2025-07-11 17:45 更新

Colly 默認把 Cookie 和已爬 URL 放在內存里,程序一關就全丟。本文教你 5 種“搬家”方案,讓數(shù)據(jù)永久保存、多臺機器共享。

一、為什么需要換存儲后端?

內存存儲的痛點 換后端的好處
進程退出 → 數(shù)據(jù)全丟 斷電重啟也能斷點續(xù)爬
單機內存有限 用數(shù)據(jù)庫/Redis 可橫向擴容
多臺節(jié)點無法共享 統(tǒng)一存儲 → 避免重復抓取

二、5 種官方支持的后端速覽

后端 特點 適用場景
內存(默認) 零依賴,速度最快 一次性腳本、調試
Redis 內存數(shù)據(jù)庫,讀寫飛快 分布式爬蟲、隊列
BoltDB 單文件嵌入式,無需安裝服務 本地小項目、單節(jié)點
SQLite3 單文件 SQL 數(shù)據(jù)庫 需要 SQL 查詢、報表
MongoDB / PostgreSQL 完整文檔/關系型數(shù)據(jù)庫 企業(yè)級、海量數(shù)據(jù)

三、快速上手示例

1. Redis 后端(最常用)

## 先啟動 Redis(本地或云服務器)
docker run -d -p 6379:6379 redis:alpine

package main


import (
    "github.com/gocolly/colly/v2"
    "github.com/gocolly/colly/v2/storage/redisstorage"
)


func main() {
    // 1. 連接 Redis
    store, _ := redisstorage.New(
        &redisstorage.Options{Address: "127.0.0.1:6379"},
    )


    // 2. 創(chuàng)建收集器并把“家”搬到 Redis
    c := colly.NewCollector()
    c.SetStorage(store)


    // 3. 正常寫業(yè)務邏輯
    c.OnHTML("title", func(e *colly.HTMLElement) {
        println("標題:", e.Text)
    })


    c.Visit("http://m.o2fo.com/")
}

效果

  • 重啟程序 → 自動跳過已爬 URL。
  • 開 10 臺云主機 → 共享同一份 Redis,0 重復抓取。

2. BoltDB 后端(零依賴單文件)

go get github.com/gocolly/colly/v2/storage/boltdb

package main


import (
    "github.com/gocolly/colly/v2"
    "github.com/gocolly/colly/v2/storage/boltdb"
)


func main() {
    store, _ := boltdb.New("crawler.db") // 自動生成一個文件
    c := colly.NewCollector()
    c.SetStorage(store)


    c.OnHTML("title", func(e *colly.HTMLElement) {
        println("標題:", e.Text)
    })


    c.Visit("http://m.o2fo.com/")
}

特點

  • 只生成一個 crawler.db 文件,拷走即可遷移。
  • 適合個人電腦或 U 盤攜帶。

3. SQLite3 后端(想用 SQL 查詢)

go get github.com/gocolly/colly/v2/storage/sqlite3

store, _ := sqlite3.New("crawler.sqlite")
c := colly.NewCollector()
c.SetStorage(store)

進階玩法
爬完后直接用 sqlite3 crawler.sqlite 命令行查詢:

SELECT * FROM visited_urls WHERE url LIKE '%w3cschool%';

四、如何自己寫存儲后端?

只要實現(xiàn) colly/storage.Storage 接口的 4 個方法即可:

type Storage interface {
    Init() error
    Visited(requestID uint64) error
    IsVisited(requestID uint64) (bool, error)
    Cookies(u *url.URL) string
}

示例:把數(shù)據(jù)存到 MySQL、阿里云 OSS、甚至微信云托管,都能搞定!

五、實戰(zhàn)選型建議

需求 推薦后端 一句話理由
本地腳本 內存 / BoltDB 簡單、零依賴
分布式集群 Redis 快、天然共享
需要 SQL 報表 SQLite3 / PostgreSQL 直接跑 SQL
海量數(shù)據(jù) MongoDB 文檔型易擴展

六、動手實驗(1 分鐘完成)

  1. 打開 終端 → 新建 Go 文件。
  2. 復制 “Redis 后端” 示例 → 把 127.0.0.1:6379 換成 Redis 實驗地址 → 運行。
  3. 關掉終端 → 重新打開 → 再次運行 → 觀察是否秒跳過已爬頁面。
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號