colly默认串行,需设c.async=true并配c.limit()才真正异步;onhtml不触发主因是ua被拦、302跳转未处理或url不完整,须设useragent、allowurlrevisit及完整url。

Go-colly 默认是同步的,怎么让它真正异步运行
Go-colly 本身基于 net/http,底层并发靠的是 goroutine + callback,但它的 c.Visit() 和 c.OnHTML() 等方法默认不阻塞,**真正决定是否“异步”的是你如何调度请求和处理回调**。很多人误以为调用一次 c.Visit() 就自动并发,其实它只是把请求扔进队列——真正并发数由 c.MaxDepth、c.Async 和 c.MaxBodySize 等配置共同约束。
关键操作:
- 必须显式设置
c.Async = true,否则所有请求会串行执行(即使你开了多个 goroutine 调用Visit) -
c.Limit(&colly.LimitRule{DomainGlob: "*", Parallelism: 5})控制并发连接数,不设就可能被目标站封或触发 TCP TIME_WAIT 暴增 - 避免在
OnHTML回调里直接调用c.Visit()多层嵌套——这容易绕过限流,应改用c.Request()手动构造并复用上下文
抓取结果怎么安全地收集到一个 slice 里
Go-colly 的回调函数运行在独立 goroutine 中,直接往全局 []string 或 map[string]bool 写数据会引发 panic:concurrent map writes 或 slice append 竞态。别用 sync.Mutex 包裹每次 append——性能差且易漏锁。
推荐做法:
- 用
chan接收结果,主 goroutine 用for range收集,例如:results := make(chan string, 100) - 在
c.OnHTML()里只做解析,把结构化数据(如struct{URL, Title string})发到 channel,不要做 I/O 或网络调用 - 如果必须聚合到 slice,用
sync.Map存 key-value,或初始化带容量的 slice +sync.WaitGroup+ 指针传参,避免扩容时的竞态
为什么抓着抓着就卡住或返回空响应
常见原因不是代码写错,而是 Go-colly 遇到 HTTP 层或中间件拦截没显式处理:
- 目标站返回 302 重定向但没开
c.AllowURLRevisit = true,导致跳转后 URL 被去重丢弃 - 响应 body 超过默认
c.MaxBodySize = 10 * 1024 * 1024(10MB),直接截断,OnHTML拿不到完整 DOM —— 查日志会看到"body size exceeded" - 没设置
User-Agent,Nginx 或 Cloudflare 直接 403;建议用c.UserAgent = "Mozilla/5.0 (X11; Linux x86_64)..." - JS 渲染页(如 React/Vue SPA)无法用 colly 解析,它不执行 JS —— 此时得换 Puppeteer 或 Playwright,别硬扛
如何让 Go-colly 和你的 Go module 工程自然共存
Go-colly v2(当前主流)要求 Go ≥ 1.16,且依赖 golang.org/x/net/html 和 github.com/gocolly/colly/v2。如果你的 go.mod 里混用了 v1(github.com/gocolly/colly)和 v2,go build 会报 undefined: colly.NewCollector 这类错误。
实操步骤:
- 删掉旧 import:
import "github.com/gocolly/colly",换成import "github.com/gocolly/colly/v2" - 检查
go.mod是否含两行 colly:v1 和 v2 不能共存,手动删掉 v1 行再go mod tidy - Collector 初始化必须用
colly.NewCollector(),不是colly.New()(v1 写法) - 若工程启用了 Go Proxy(如 GOPROXY=https://proxy.golang.org),确保能拉到
v2tag —— 有些内网环境需配私有 proxy 或 replace
真正麻烦的从来不是写几行 colly 代码,而是 HTTP 状态码、重定向链、反爬 header、并发节奏之间那点微妙的平衡——调参比写逻辑花的时间多。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











