Colly 默認(rèn)把 Cookie 和已爬 URL 放在內(nèi)存里,程序一關(guān)就全丟。本文教你 5 種“搬家”方案,讓數(shù)據(jù)永久保存、多臺(tái)機(jī)器共享。
內(nèi)存存儲(chǔ)的痛點(diǎn) | 換后端的好處 |
---|---|
進(jìn)程退出 → 數(shù)據(jù)全丟 | 斷電重啟也能斷點(diǎn)續(xù)爬 |
單機(jī)內(nèi)存有限 | 用數(shù)據(jù)庫(kù)/Redis 可橫向擴(kuò)容 |
多臺(tái)節(jié)點(diǎn)無(wú)法共享 | 統(tǒng)一存儲(chǔ) → 避免重復(fù)抓取 |
后端 | 特點(diǎn) | 適用場(chǎng)景 |
---|---|---|
內(nèi)存(默認(rèn)) | 零依賴,速度最快 | 一次性腳本、調(diào)試 |
Redis | 內(nèi)存數(shù)據(jù)庫(kù),讀寫(xiě)飛快 | 分布式爬蟲(chóng)、隊(duì)列 |
BoltDB | 單文件嵌入式,無(wú)需安裝服務(wù) | 本地小項(xiàng)目、單節(jié)點(diǎn) |
SQLite3 | 單文件 SQL 數(shù)據(jù)庫(kù) | 需要 SQL 查詢、報(bào)表 |
MongoDB / PostgreSQL | 完整文檔/關(guān)系型數(shù)據(jù)庫(kù) | 企業(yè)級(jí)、海量數(shù)據(jù) |
## 先啟動(dòng) Redis(本地或云服務(wù)器)
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. 正常寫(xiě)業(yè)務(wù)邏輯
c.OnHTML("title", func(e *colly.HTMLElement) {
println("標(biāo)題:", e.Text)
})
c.Visit("http://eska-fuses.cn/")
}
效果
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") // 自動(dòng)生成一個(gè)文件
c := colly.NewCollector()
c.SetStorage(store)
c.OnHTML("title", func(e *colly.HTMLElement) {
println("標(biāo)題:", e.Text)
})
c.Visit("http://eska-fuses.cn/")
}
特點(diǎn)
crawler.db
文件,拷走即可遷移。 go get github.com/gocolly/colly/v2/storage/sqlite3
store, _ := sqlite3.New("crawler.sqlite")
c := colly.NewCollector()
c.SetStorage(store)
進(jìn)階玩法
爬完后直接用 sqlite3 crawler.sqlite
命令行查詢:
SELECT * FROM visited_urls WHERE url LIKE '%w3cschool%';
只要實(shí)現(xiàn) colly/storage.Storage
接口的 4 個(gè)方法即可:
type Storage interface {
Init() error
Visited(requestID uint64) error
IsVisited(requestID uint64) (bool, error)
Cookies(u *url.URL) string
}
示例:把數(shù)據(jù)存到 MySQL、阿里云 OSS、甚至微信云托管,都能搞定!
需求 | 推薦后端 | 一句話理由 |
---|---|---|
本地腳本 | 內(nèi)存 / BoltDB | 簡(jiǎn)單、零依賴 |
分布式集群 | Redis | 快、天然共享 |
需要 SQL 報(bào)表 | SQLite3 / PostgreSQL | 直接跑 SQL |
海量數(shù)據(jù) | MongoDB | 文檔型易擴(kuò)展 |
127.0.0.1:6379
換成 Redis 實(shí)驗(yàn)地址 → 運(yùn)行。
更多建議: