Go 语言爬虫实战:基于 Colly 的高性能采集框架指南

在 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 简洁
  • 并发强
  • 扩展性高
  • 稳定可靠

本文从基础到高级应用进行了全面讲解,包括:

  1. 创建采集器与回调
  2. 解析页面内容
  3. 控制并发与反爬
  4. 代理池与 UA 伪装
  5. 自动跟随链接
  6. 保存数据
  7. 实战案例

掌握 Colly,可以让你在 Go 项目中快速构建高性能爬虫服务。

相关推荐
qq_12498707534 小时前
基于springboot的建筑业数据管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·毕业设计
IT_陈寒5 小时前
Vite 5.0实战:10个你可能不知道的性能优化技巧与插件生态深度解析
前端·人工智能·后端
z***3355 小时前
SQL Server2022版+SSMS安装教程(保姆级)
后端·python·flask
zxguan6 小时前
Springboot 学习 之 下载接口 HttpMessageNotWritableException
spring boot·后端·学习
小徐_23337 小时前
TRAE SOLO 正式发布了?我用它将像老乡鸡那样做饭小程序开源了!
前端·ai编程·trae
加洛斯7 小时前
告别数据混乱!精通Spring Boot序列化与反序列化
后端
爱分享的鱼鱼7 小时前
Spring 事务管理、数据验证 、验证码验证逻辑设计、异常回退(Java进阶)
后端
程序员西西7 小时前
Spring Boot中支持的Redis访问客户端有哪些?
java·后端
空白诗7 小时前
tokei 在鸿蒙PC上的构建与适配
后端·华为·rust·harmonyos