Loading...

文章背景图

Colly:Go 语言生态里最快的爬虫框架入门

2026-11-06
0
- 字
- 分钟
|

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。

三、官方仓库链接

四、前置要求

根据官方 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.go

6.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 等

八、常见问题

  1. go get 拉不下来 国内环境先 go env -w GOPROXY=https://goproxy.cn,direct。

  2. e.Request.Visit 报"visited URL" Colly 默认对同一 URL 去重;如需重复抓取,调用前设置 req.Ctx 或在 NewCollector 时关闭去重。

  3. 被目标站封 IP LimitRule 里调小 Parallelism、加大 Delay,并通过 SetProxy 接入代理池。

  4. 需要登录态抓取 在 OnRequest 里设置 req.Headers.Set("Cookie", "..."),或用 c.SetCookies(url, cookies) 一次性注入。

  5. 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 控制并发数与请求延时,避免对目标服务器造成压力。
  • 不要绕过登录态、付费墙、验证码或其他访问控制去获取未授权内容。
  • 不批量采集、存储或再分发涉及个人隐私的数据。
  • 本框架仅用于公开数据采集、学术研究与合法的商业分析,使用者自行承担合规责任。
  • 尊重原作者版权,抓取到的正文、图片等内容在二次发布时应注明来源并遵守相应许可。
评论交流

文章目录