Colly 队列爬取:让爬虫任务排队执行
2025-07-14 15:25 更新
一键把 1000 个 URL 交给“小管家”排队,自动限速、并发可控,复制即可跑!
一、示例:
爬 编程狮课程列表,并设置 3 个并发线程:
package main
import (
"fmt"
"github.com/gocolly/colly/v2"
"github.com/gocolly/colly/v2/queue"
)
func main() {
// 1. 创建收集器
c := colly.NewCollector()
// 2. 新建队列:3 个并发线程 + 内存存储 1 万条
q, _ := queue.New(
3, // 同时 3 个 goroutine 去请求
&queue.InMemoryQueueStorage{MaxSize: 10000},
)
// 3. 打印每次访问的 URL
c.OnRequest(func(r *colly.Request) {
fmt.Println("正在访问:", r.URL)
})
// 4. 把 URL 压进队列(模拟 5 个课程页)
for i := 1; i <= 5; i++ {
q.AddURL(fmt.Sprintf("https://www.w3cschool.cn/course/%d", i))
}
// 5. 启动队列,自动消费所有 URL
q.Run(c)
}
二、运行步骤(1 分钟搞定)
- 安装依赖
go get github.com/gocolly/colly/v2/queue
- 保存文件
把代码保存为queue.go
。
- 一键运行
go run queue.go
终端输出(并发 3 线程):
正在访问: https://www.w3cschool.cn/course/1
正在访问: https://www.w3cschool.cn/course/2
正在访问: https://www.w3cschool.cn/course/3
正在访问: https://www.w3cschool.cn/course/4
正在访问: https://www.w3cschool.cn/course/5
三、队列 3 大亮点
亮点 | 一句话解释 | 对应代码 |
---|---|---|
并发可控 | 想多快就多快,不撑爆目标站 | queue.New(3, ...) |
自动去重 | 同一 URL 不会重复爬取 | 内置哈希去重 |
断点续爬 | 程序挂了重启继续 | 换持久化存储见下方 |
四、进阶:换持久化队列(断点续爬)
把内存换成 Redis,程序重启也能接着爬:
go get github.com/gocolly/colly/v2/storage/redisstorage
store, _ := redisstorage.New(&redisstorage.Options{Address: "127.0.0.1:6379"})
q, _ := queue.New(3, &queue.RedisQueueStorage{Client: store.Client})
五、常见问题速查
问题 | 原因 | 解决 |
---|---|---|
队列卡住 | 目标站限速 | 调小并发数或加 Delay |
内存暴涨 | 队列太大 | 减小 MaxSize 或换 Redis |
URL 重复 | 忘记过滤 | 先 AddURL 前做去重 |
六、1 分钟动手实验
- 打开 终端 → 新建
queue.go
。 - 复制上方代码 → 把 URL 换成你想爬的列表 → 运行。
- 观察终端:3 线程并发,任务自动完成。
以上内容是否对您有帮助:
更多建议: