colly.NewCollector() 初始化抓不到页面主因是默认禁用JS渲染且未设UserAgent或处理重定向;需显式设置UserAgent、开启AllowURLRevisit、用AbsoluteURL转相对链接、控制并发并加Delay,CSV保存需加BOM头防乱码。

colly.NewCollector() 初始化时为什么抓不到页面?
常见现象是 OnHTML 完全没触发,或者 Visit 后无日志、无回调。根本原因往往是默认不启用 JavaScript 渲染,且未处理重定向或 User-Agent 拦截。
- 必须显式设置
UserAgent,多数网站会拒收空 UA 的请求:collector := colly.NewCollector(colly.UserAgent("Mozilla/5.0 (X11; Linux x86_64)")) - 如果目标页依赖跳转(如 302 到登录页),需开启
AllowURLRevisit和MaxDepth控制爬取深度 - 页面由 JS 动态渲染?colly 本身不执行 JS,别硬扛——要么换
chromedp,要么先确认目标数据是否在 HTML 源码里(右键“查看网页源代码”搜关键词)
怎么安全地提取 href 和文本内容?
直接用 e.Attr("href") 很容易 panic,因为属性可能不存在;用 e.Text 又常混入空白、换行或隐藏节点内容。
- 提取链接前务必检查属性是否存在:
if href, ok := e.Attr("href"); ok { /* 处理 href */ } - 文本清洗推荐用
strings.TrimSpace(e.Text),避免前后空格和 \n 影响后续解析 - 相对 URL 需手动转绝对地址:
collector.AbsoluteURL(href),否则Visit会失败
并发抓取时出现连接被拒绝或 429 错误怎么办?
colly 默认并发是 1,但很多人一上来就设 Parallelism: 10,结果被风控或服务端限流。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 先用
Delay: 1 * time.Second控制请求间隔,比暴力并发更稳定 - 限制并发数建议从 2–3 起步,观察响应状态码;
HTTP 429出现就立刻降并发 + 加随机 delay - 不同域名要单独建
Collector实例,colly 的AllowedDomains不影响并发隔离,混用会导致策略冲突
保存数据到 CSV 时中文乱码或字段错位
Go 默认写文件是 UTF-8,但 Excel 打开 CSV 常默认用 ANSI 编码读,导致中文显示为问号;字段含逗号、换行则会破坏 CSV 结构。
立即学习“go语言免费学习笔记(深入)”;
- 写入前加 BOM 头可解决 Excel 识别问题:
f.WriteString("\xEF\xBB\xBF") - 用
encoding/csv包写,别手拼字符串——它自动转义逗号和双引号 - 结构体字段含换行符?提前用
strings.ReplaceAll(text, "\n", " ")处理,否则 CSV 解析器会误判行尾
实际跑通一个采集任务,最难的往往不是语法,而是判断哪些字段真正在 HTML 源码里、哪些请求头绕不过反爬、以及什么时候该停手等下一轮——这些没法靠框架自动补全。

















