Colly 存储后端:给爬虫数据安个“家”
2025-07-11 17:45 更新
Colly 默认把 Cookie 和已爬 URL 放在内存里,程序一关就全丢。本文教你 5 种“搬家”方案,让数据永久保存、多台机器共享。
一、为什么需要换存储后端?
内存存储的痛点 | 换后端的好处 |
---|---|
进程退出 → 数据全丢 | 断电重启也能断点续爬 |
单机内存有限 | 用数据库/Redis 可横向扩容 |
多台节点无法共享 | 统一存储 → 避免重复抓取 |
二、5 种官方支持的后端速览
后端 | 特点 | 适用场景 |
---|---|---|
内存(默认) | 零依赖,速度最快 | 一次性脚本、调试 |
Redis | 内存数据库,读写飞快 | 分布式爬虫、队列 |
BoltDB | 单文件嵌入式,无需安装服务 | 本地小项目、单节点 |
SQLite3 | 单文件 SQL 数据库 | 需要 SQL 查询、报表 |
MongoDB / PostgreSQL | 完整文档/关系型数据库 | 企业级、海量数据 |
三、快速上手示例
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. 创建收集器并把“家”搬到 Redis
c := colly.NewCollector()
c.SetStorage(store)
// 3. 正常写业务逻辑
c.OnHTML("title", func(e *colly.HTMLElement) {
println("标题:", e.Text)
})
c.Visit("https://www.w3cschool.cn/")
}
效果
- 重启程序 → 自动跳过已爬 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("https://www.w3cschool.cn/")
}
特点
- 只生成一个
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%';
四、如何自己写存储后端?
只要实现 colly/storage.Storage
接口的 4 个方法即可:
type Storage interface {
Init() error
Visited(requestID uint64) error
IsVisited(requestID uint64) (bool, error)
Cookies(u *url.URL) string
}
示例:把数据存到 MySQL、阿里云 OSS、甚至微信云托管,都能搞定!
五、实战选型建议
需求 | 推荐后端 | 一句话理由 |
---|---|---|
本地脚本 | 内存 / BoltDB | 简单、零依赖 |
分布式集群 | Redis | 快、天然共享 |
需要 SQL 报表 | SQLite3 / PostgreSQL | 直接跑 SQL |
海量数据 | MongoDB | 文档型易扩展 |
六、动手实验(1 分钟完成)
- 打开 终端 → 新建 Go 文件。
- 复制 “Redis 后端” 示例 → 把
127.0.0.1:6379
换成 Redis 实验地址 → 运行。 - 关掉终端 → 重新打开 → 再次运行 → 观察是否秒跳过已爬页面。
以上内容是否对您有帮助:
更多建议: