Colly:Go 语言生态里最快的爬虫框架入门
一、项目简介与定位
Colly 是一个用 Go 编写的爬虫框架,官方定位是 "Lightning Fast and
Elegant Scraping Framework for Gophers"。它提供一套干净的回调式
API:注册
OnHTML、OnRequest、OnResponse
等钩子,Colly 负责调度、Cookie、并发、延时、缓存与 robots.txt。官方
README 给出的性能指标是单核可跑 1k+
请求/秒,适合做数据挖掘、数据处理与归档类任务。
Colly 当前主版本为 v2,导入路径为
github.com/gocolly/colly/v2。
二、开源协议
Colly 采用 MIT License。
三、官方仓库链接
- 仓库:https://github.com/gocolly/colly
- 文档(GoDoc):https://pkg.go.dev/github.com/gocolly/colly/v2
- 示例集:https://github.com/gocolly/colly/tree/master/_examples
四、前置要求
根据官方 README:
- Go 1.18+(模块模式)
- 任意支持 Go 的操作系统(Linux / macOS / Windows)
- 网络可访问
proxy.golang.org或配置好 GOPROXY
五、安装部署
官方 README 给出的安装命令:
go get github.com/gocolly/colly/v2在已有 Go Module 项目里:
mkdir demo-colly && cd demo-colly
go mod init demo-colly
go get github.com/gocolly/colly/v2六、最小示例代码
官方 README 示例:
package main
import (
"fmt"
"github.com/gocolly/colly/v2"
)
func main() {
c := colly.NewCollector()
// Find and visit all links
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
e.Request.Visit(e.Attr("href"))
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL)
})
c.Visit("http://go-colly.org/")
}运行:
go run main.go6.1 抽取结构化字段
c := colly.NewCollector()
type Quote struct {
Text string `json:"text"`
Author string `json:"author"`
}
c.OnHTML("div.quote", func(e *colly.HTMLElement) {
q := Quote{
Text: e.ChildText("span.text"),
Author: e.ChildText("small.author"),
}
b, _ := json.Marshal(q)
fmt.Println(string(b))
})
c.Visit("https://quotes.toscrape.com/")6.2 限制并发与延时
c := colly.NewCollector(
colly.MaxDepth(3),
colly.UserAgent("demo-colly/1.0 (+https://example.com)"),
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 4,
Delay: 1 * time.Second,
RandomDelay: 500 * time.Millisecond,
})6.3 遵守 robots.txt
Colly 内置 robots 支持:
c := colly.NewCollector(
colly.URLFilters(
neturl.UserAgent("demo-colly/1.0"),
),
)更常见的做法是配合 robots.txt 解析库在
OnRequest 钩子里自行判断。
七、配置项
Colly 官方 README 列出的特性即对应配置能力:
| 能力 | 对应 API |
|---|---|
| 干净的回调 API | OnHTML / OnRequest /
OnResponse / OnError |
| 单核 >1k req/s | 由 Go 协程天然提供 |
| 请求延时与并发上限 | Limit(&colly.LimitRule{...}) |
| 自动 Cookie / Session | 默认开启 |
| 同步 / 异步 / 并行抓取 | colly.NewCollector(async ...) |
| 响应缓存 | colly.CacheDir("./.cache") |
| 非 Unicode 响应自动转码 | 默认开启 |
| robots.txt 支持 | 通过 URLFilters / 中间件 |
| 分布式抓取 | 配合 colly/extensions 中的 Redis 队列 |
| 环境变量配置 | colly.Debugger 等 |
八、常见问题
go get拉不下来 国内环境先go env -w GOPROXY=https://goproxy.cn,direct。e.Request.Visit报"visited URL" Colly 默认对同一 URL 去重;如需重复抓取,调用前设置req.Ctx或在NewCollector时关闭去重。被目标站封 IP
LimitRule里调小Parallelism、加大Delay,并通过SetProxy接入代理池。需要登录态抓取 在
OnRequest里设置req.Headers.Set("Cookie", "..."),或用c.SetCookies(url, cookies)一次性注入。JS 渲染页面抓不到 Colly 本身不执行 JS。需要渲染时配合
chromedp或rod另起一个浏览器上下文,把渲染后的 HTML 喂回 Colly。
九、与同类工具对比
- vs. Scrapy(Python):Scrapy 生态更全、中间件更多;Colly 内存占用更低、单机吞吐更高,适合 Go 技术栈或长期驻留服务。
- vs. goquery:goquery 只是 jQuery 风格的 HTML 解析器,不做调度、去重与并发;Colly 把这些都做好了。
- vs. chromedp:chromedp 是 CDP 客户端,用来驱动浏览器;Colly 是 HTTP 爬虫,两者解决的问题不同,常搭配使用。
- vs. pyspider:pyspider 有 WebUI 但已不活跃;Colly 仍在持续维护,性能与稳定性更适合生产。
十、许可
本项目基于 MIT License 发布。详情见仓库根目录 LICENSE 文件。
十一、责任使用声明
- 抓取前遵守目标站点的
robots.txt与服务条款,仅采集公开允许访问的页面。 - 通过
LimitRule控制并发数与请求延时,避免对目标服务器造成压力。 - 不要绕过登录态、付费墙、验证码或其他访问控制去获取未授权内容。
- 不批量采集、存储或再分发涉及个人隐私的数据。
- 本框架仅用于公开数据采集、学术研究与合法的商业分析,使用者自行承担合规责任。
- 尊重原作者版权,抓取到的正文、图片等内容在二次发布时应注明来源并遵守相应许可。