在 Python 生态中,Scrapy 是大家熟知的爬虫框架;而在 Go 语言世界里,Colly 则是同级别的轻量级、高性能、易扩展的采集利器。 凭借 Go 的并发优势,Colly 能够在极低资源占用下实现高并发抓取,是构建数据采集、监控、舆情系统的理想选择。
本文将带你快速掌握 Colly 的核心能力,从安装、基础用法到反爬突破与案例实战,帮助你快速上手 Go 爬虫。
一 Colly 是什么?
Colly 是 Go 中最流行的爬虫框架之一,目标是提供 快速 可靠 可扩展 的网络爬虫解决方案
它具有以下特点:
- API 简洁清晰,上手难度低
- 内置并发队列,支持高并发爬取
- 自动管理 Cookie、Referer、User-Agent
- 支持 DOM 选择器 CSS Selector
- 支持深度控制、域名白名单、请求限制
- 支持回调函数式编程,非常灵活
- 可扩展中间件、代理、去重规则
这使得 Colly 成为构建生产级爬虫的强大工具。
二 安装 Colly
执行:
bash
go get -u github.com/gocolly/colly/v2
导入:
go
import "github.com/gocolly/colly/v2"
你就可以开始写爬虫了。
三 编写你的第一个 Colly 爬虫
下面通过一个示例,抓取新闻网站的标题。
1 创建采集器
go
c := colly.NewCollector()
2 注册回调解析页面内容
go
c.OnHTML("h1.title", func(e *colly.HTMLElement) {
fmt.Println("标题:", e.Text)
})
3 处理请求事件
go
c.OnRequest(func(r *colly.Request) {
fmt.Println("正在访问:", r.URL.String())
})
4 开始访问网页
go
c.Visit("https://news.ycombinator.com/")
完整代码:
go
package main
import (
"fmt"
"github.com/gocolly/colly/v2"
)
func main() {
c := colly.NewCollector()
c.OnRequest(func(r *colly.Request) {
fmt.Println("访问:", r.URL.String())
})
c.OnHTML("a.storylink", func(e *colly.HTMLElement) {
fmt.Println("标题:", e.Text)
fmt.Println("链接:", e.Attr("href"))
})
c.Visit("https://news.ycombinator.com/")
}
运行后即可得到列表页面的标题与链接。
四 处理多页面采集(自动跟随链接)
Colly 支持在页面中发现新的 URL 并自动继续爬取:
go
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
link := e.Request.AbsoluteURL(e.Attr("href"))
c.Visit(link)
})
配合访问去重机制,Colly 会自动忽略已访问 URL。
五 设置请求限制:防止被封 IP
为了避免频繁访问触发反爬,可以设置速率限制。
go
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Delay: 1 * time.Second,
RandomDelay: 500 * time.Millisecond,
})
也可以限制并发:
go
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 2,
})
六 设置 User-Agent、Cookie 与 Header
反爬网站通常会检查 UA 或 Cookie。
go
c.OnRequest(func(r *colly.Request) {
r.Headers.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0)")
r.Headers.Set("Referer", "https://www.google.com")
})
七 使用代理池突破封禁
go
import "github.com/gocolly/colly/v2/proxy"
func main() {
c := colly.NewCollector()
rp, _ := proxy.RoundRobinProxySwitcher(
"http://127.0.0.1:8080",
"http://127.0.0.1:8081",
)
c.SetProxyFunc(rp)
c.Visit("https://example.com")
}
多代理轮换能显著降低封 IP 风险。
八 深度控制与域名限制
防止爬虫跑飞:
go
c.AllowedDomains = []string{"example.com"}
限制深度:
go
c.MaxDepth = 2
九 数据存储:CSV、JSON、数据库
保存到 CSV:
go
f, _ := os.Create("result.csv")
w := csv.NewWriter(f)
c.OnHTML("h2", func(e *colly.HTMLElement) {
w.Write([]string{e.Text})
})
保存到 MySQL / MongoDB 也只需在回调中插入数据库即可。
十 实战案例:抓取京东商品信息
示例:抓取商品名称与价格
go
c := colly.NewCollector()
c.OnHTML(".gl-item", func(e *colly.HTMLElement) {
title := e.ChildText(".p-name em")
price := e.ChildText(".p-price i")
fmt.Println(title, price)
})
c.Visit("https://search.jd.com/Search?keyword=手机")
输出:
yaml
小米 14 4599
iPhone 15 5999
......
短短十行代码即可完成一个实用的采集器。
十一 Colly 适合哪些场景?
- 商品价格监控
- 平台舆情与数据采集
- 文章/新闻抓取
- 实时监控系统
- 多站点聚合爬虫
- 数据分析与可视化后台的数据来源
Go 的高并发 + Colly 的简洁 API = 高性能、高可靠的数据采集工具。
十二 总结
Colly 是 Go 中最易用、最强大的爬虫框架之一,具备:
- API 简洁
- 并发强
- 扩展性高
- 稳定可靠
本文从基础到高级应用进行了全面讲解,包括:
- 创建采集器与回调
- 解析页面内容
- 控制并发与反爬
- 代理池与 UA 伪装
- 自动跟随链接
- 保存数据
- 实战案例
掌握 Colly,可以让你在 Go 项目中快速构建高性能爬虫服务。