
go 本身无法执行 javascript,因此无法直接解析依赖 ajax 或前端框架(如 vue/react)动态生成的内容;正确做法是分析浏览器网络请求,定位真实数据接口,再用 go 直接调用该 api 获取结构化数据。
go 本身无法执行 javascript,因此无法直接解析依赖 ajax 或前端框架(如 vue/react)动态生成的内容;正确做法是分析浏览器网络请求,定位真实数据接口,再用 go 直接调用该 api 获取结构化数据。
在 Go 中抓取网页时,net/http + goquery 组合仅能获取服务端返回的初始 HTML 文本,对 <script> 标签中通过 fetch、XMLHttpRequest 或前端路由(如 #/page-2)触发的异步加载内容完全无感知——因为这些逻辑只在浏览器环境运行,而 Go 程序不具备 JS 执行引擎。</script>
✅ 正确解决路径:逆向分析网络请求
- 打开目标网站 → 按 F12 进入开发者工具 → 切换到 Network(网络)标签页
- 刷新页面或手动触发分页/加载动作(如点击“下一页”)
- 筛选 XHR / Fetch 请求,查找返回 JSON 或 HTML 片段的接口(如 /api/products?page=2 或 /data.json)
- 复制该请求的 URL、Headers(尤其是 Cookie、X-Requested-With、Referer)及请求方法(GET/POST)
- 在 Go 中模拟该请求,直接获取结构化数据
例如,若发现分页实际调用的是:
GET https://example.com/api/products?page=2 Accept: application/json User-Agent: Mozilla/5.0...
则 Go 代码应改为:
func fetchProducts(page int) ([]Product, error) {
url := fmt.Sprintf("https://example.com/api/products?page=%d", page)
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return nil, fmt.Errorf("API returned status %d", resp.StatusCode)
}
var data struct {
Products []Product `json:"products"`
}
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
return nil, err
}
return data.Products, nil
}
type Product struct {
Name string `json:"name"`
Price float64 `json:"price"`
}
⚠️ 注意事项
- 避免伪造哈希/签名参数:部分接口需时间戳、token 或加密签名,需逆向 JS 逻辑(如分析 webpack 打包后的 sign() 函数),此时建议改用 Headless 浏览器(如 chromedp)——但应作为最后手段,因其资源开销大、稳定性低。
- 遵守 robots.txt 与服务条款:高频请求可能触发风控,务必添加合理延迟(time.Sleep(1 * time.Second))并设置 User-Agent。
- 不要依赖 fragment(# 后内容):uri + "#/page-2" 在 Go 的 HTTP 请求中不会发送给服务器,该片段仅由浏览器 JS 解析,服务端根本收不到。
✅ 总结
Go 是服务端语言,不执行前端 JS;与其尝试“让 Go 运行 JS”,不如精准定位真实数据接口——这是更高效、稳定、可维护的工程实践。优先使用 Network 面板分析请求,再用 http.Client 直接对接 API;仅当接口不可逆向或需完整渲染时,才考虑 chromedp 或 Playwright 等浏览器自动化方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











