根本原因是 path 未配置:macos/linux 需将 /usr/local/go/bin 加入 ~/.zshrc 并 source;windows 需在系统环境变量 path 中添加 c:\go\bin;验证用 go version。

Go 安装后 go version 报错:command not found
根本原因是 PATH 没配对。macOS/Linux 下装完 Go,go 二进制通常在 /usr/local/go/bin;Windows 默认在 C:\Go\bin。但 shell 不会自动识别这个路径。
- macOS/Linux:把
export PATH=$PATH:/usr/local/go/bin加到~/.zshrc(或~/.bash_profile)里,然后运行source ~/.zshrc - Windows:右键“此电脑”→“属性”→“高级系统设置”→“环境变量”,在“系统变量”里找到
Path,新增一行C:\Go\bin - 验证:新开终端,执行
go version应该输出类似go version go1.22.3 darwin/arm64
用 net/http 发 GET 请求但返回空或 403
很多网站默认拒绝非浏览器 User-Agent,net/http 默认不带任何 header,容易被拦截。这不是代码写错了,是反爬第一道门槛。
- 必须手动设置
User-Agent,例如:req, _ := http.NewRequest("GET", url, nil) req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36") - 有些站点还校验
Accept或Accept-Language,加一句req.Header.Set("Accept", "text/html,application/xhtml+xml")更稳妥 - 别用
http.Get(url)简写——它没法设 header,一用就 403
解析 HTML 时 golang.org/x/net/html 遍历节点卡死或漏节点
这个包是流式解析器,不加载完整 DOM 树,靠手动递归 FirstChild/NextSibling 走,写错一步就跳过整块结构。
- 常见错误:只遍历
node.FirstChild,忘了递归处理node.NextSibling,导致只扫到第一个子节点 - 推荐写法:用栈或队列做广度优先遍历,避免递归过深或遗漏兄弟节点
- 更省事的选择:直接上
github.com/PuerkitoBio/goquery,语法接近 jQuery,doc.Find("a[href]").Each(...)一行就能取所有链接 - 注意:goquery 依赖
net/html,仍需处理 charset(比如网页是 GBK 编码,得先用golang.org/x/text/encoding转 UTF-8)
并发抓取时被封 IP 或 goroutine 泄露
开 100 个 goroutine 直接发请求,没限速、没复用连接、没设超时,服务器端看到的就是洪水攻击。
- 必须设全局
http.Client并配置Timeout和Transport,例如:client := &http.Client{ Timeout: 10 * time.Second, Transport: &http.Transport{ MaxIdleConns: 100, MaxIdleConnsPerHost: 100, IdleConnTimeout: 30 * time.Second, }, } - 用
semaphore控制并发数,比如最多同时跑 5 个请求:var sem = make(chan struct{}, 5) for _, url := range urls { sem - 别在循环里直接
go fetch(url)——没控制、没回收、goroutine 积压成堆
真正麻烦的不是写爬虫,是让每个请求看起来像真人:随机 delay、合理 header、连接复用、编码处理、错误重试策略。这些细节不补全,程序跑三分钟就被目标站拉黑。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











