Colly + Redis 持久化:断点续爬与分布式一步到位
2025-07-14 16:48 更新
进程挂了数据全丢?单机内存不够?用 Redis 当“硬盘”,已爬 URL、Cookie 永久保存,多台机器共享同一份进度!
一、示例:
爬 编程狮课程频道,保留断点续爬能力:
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{
"https://www.w3cschool.cn/go",
"https://www.w3cschool.cn/python",
"https://www.w3cschool.cn/java",
}
// 2. Redis 连接信息(本地或云 Redis 均可)
store := &redisstorage.Storage{
Address: "127.0.0.1:6379", // 换成你的 Redis 地址
Password: "", // 若有密码填这里
DB: 0, // 使用默认 0 号库
Prefix: "w3cschool_crawler", // key 前缀,避免冲突
}
// 3. 创建收集器并把“家”安到 Redis
c := colly.NewCollector()
if err := c.SetStorage(store); err != nil {
log.Fatal("连接 Redis 失败:", err)
}
// 4. 清空上一次测试数据(正式上线可注释掉)
_ = store.Clear()
// 5. 创建队列:并发 3 线程 + Redis 持久化
q, _ := queue.New(3, store)
// 6. 打印 Cookie(验证登录态是否持久)
c.OnResponse(func(r *colly.Response) {
log.Println("Cookies:", c.Cookies(r.Request.URL.String()))
})
// 7. 把 URL 压进队列
for _, u := range urls {
_ = q.AddURL(u)
}
// 8. 启动队列,自动消费
q.Run(c)
}
二、3 步快速跑通
步骤 | 命令/操作 | 说明 |
---|---|---|
① 启动 Redis | docker run -d -p 6379:6379 redis |
本地或云服务器均可 |
② 安装依赖 | go get github.com/gocolly/colly/v2/... |
一键拉取新版 |
③ 运行 | go run main.go |
看到进度与 Cookie 实时写入 Redis |
三、Redis 存储到底存了什么?
使用 redis-cli
查看:
127.0.0.1:6379> keys w3cschool_crawler*
1) "w3cschool_crawler:visited_urls"
2) "w3cschool_crawler:cookies_https:www.w3cschool.cn"
visited_urls
记录已爬链接,重启后自动跳过。cookies_*
保存登录态,多台机器共享同一份 Cookie。
四、常见问题速查
问题 | 原因 | 解决 |
---|---|---|
connection refused |
Redis 没启动或端口错 | docker ps 检查 6379 是否监听 |
数据没保存 | 忘记 SetStorage |
确保 c.SetStorage(store) 已写 |
想清空重来 | 一键清库 | store.Clear() 或 FLUSHDB |
五、1 分钟进阶:多台机器共享进度
- 把
Address
改成云 Redis(阿里云、腾讯云)。 - 所有节点跑同一份代码,自动去重、共享 Cookie。
- 扩容只需再开一台机器,零代码改动!
以上内容是否对您有帮助:
更多建议: