Colly默认同步,必须显式启用colly.Async()并调用c.Wait()阻塞等待,否则goroutine被终止导致OnHTML不触发;并发需配合Delay与Parallelism合理配置,中文CSV须加BOM头并用encoding/csv.Writer处理转义。

Colly 默认不是异步的,必须显式启用 colly.Async(),否则所有请求会串行阻塞执行,根本达不到“高并发”效果。
为什么 c.Visit() 没触发 OnHTML 回调?
常见现象是日志里只看到 OnRequest,但后续回调全无——这几乎一定是没启用异步模式,或 Collector 初始化后直接退出了进程。
-
colly.NewCollector()默认是同步模式,Visit()会立即返回,不等响应就继续往下走 - 必须加
colly.Async():c := colly.NewCollector(colly.Async()) - 异步下必须调用
c.Wait()阻塞等待所有 goroutine 完成,否则 main 函数退出,goroutine 被强制终止 - 如果目标页有重定向(如 302 到登录页),还需开启
AllowURLRevisit,否则跳转后 URL 被去重丢弃
colly.LimitRule 并发控制的实际效果
并发数不是越大越好,Parallelism 设为 10 很可能直接触发 429 或连接拒绝,尤其对中小站点。
- 建议从
Parallelism: 2起步,观察状态码分布:OnError和OnResponse里打印r.StatusCode -
DomainGlob: "*"适用于单域名任务;多域名时务必分 rule 设置,混用会导致策略覆盖 -
Delay比单纯降并发更稳:例如Delay: 500 * time.Millisecond+Parallelism: 3,比Parallelism: 8无 delay 更可靠 - 注意:
Limit()是 per-domain 的,不是全局并发上限;多个LimitRule可共存,Colly 自动匹配最精确的 rule
中文数据写入 CSV 乱码和结构破坏问题
Go 写 UTF-8 没问题,但 Excel 默认用 ANSI 解析 CSV,导致中文变问号;字段含逗号、换行则直接错位。
立即学习“go语言免费学习笔记(深入)”;
- 写文件前必须加 BOM 头:
file.Write([]byte("\xef\xbb\xbf")),否则 Excel 打开即乱码 - 字段内容需手动转义:用双引号包裹,内部双引号转为两个双引号(
"→""),换行符替换为\n或删掉 - 不要手拼 CSV 字符串;用标准库
encoding/csv的Writer,它自动处理引号和转义 - 如果字段含 HTML 标签(如
e.Text),先用strings.TrimSpace()清空首尾空白,再用html.UnescapeString()解码实体
真正容易被忽略的是:异步模式下 OnScraped 不代表全部完成——它只表示当前 request 的回调执行完毕,而 c.Wait() 才是最终屏障。很多人在 OnScraped 里就 close file 或 exit,结果部分 goroutine 还没写完数据。


















