【问题标题】:Golang Simulate Page Visit : Surf Not Triggering JavascriptGolang 模拟页面访问:冲浪不触发 Javascript
【发布时间】:2026-02-04 23:20:04
【问题描述】:

我有一个 Go 程序,它只是模拟使用 Surf (gopkg.in/headzoo/surf.v1) 访问的本地网页,但页面上的 Javascript 似乎没有被执行。只是为了测试我让网页对服务器上的另一个路由进行 ajax 调用,该路由只会在服务器端输出响应。

<html>
<head>
<script src="jquery.min.js"></script>
</head>
<body>
<script>
$.ajax ({
    url : "/test",
    type : "GET",
    success : function(res) {},
    error : function(res) {}
});
</script>
</body>
</html>

然后使用 Go Surf 函数访问页面,该路由也在服务器端输出响应,该响应正在显示,但来自 ajax 请求的响应没有显示。

func simulateVisit() {

    bow := surf.NewBrowser()
    bow.SetUserAgent("LocalCrawler/1.0")

    err := bow.Open("http://127.0.0.1/page")
    if err != nil { fmt.Println(err) }

}

为了确保它只发生在 Surf 中,我还使用 Chromedp (github.com/chromedp/chromedp) 对其进行了测试,它给出了正确的两种响应。

这是对 Surf 的限制还是我在做一些傻事?

【问题讨论】:

    标签: go web-scraping emulation


    【解决方案1】:

    Surf 不包含 JS 运行时。它确实支持下载scripts,但它永远不会真正执行它们。

    【讨论】:

    • 混蛋,这有点令人失望,但你这么多
    • 我想你不知道有 JS 运行时的 Surf 替代品吗?那将是相当惊人的
    • 不抱歉,我知道的唯一一个在 go 中实现的 JS 运行时是 github.com/dop251/goja。但我认为没有人接受过将爬虫和 JS 运行时结合起来的挑战。可能是因为您必须实现 Web API,因此需要 3/4 的浏览器。 chromedp 是获得类似 AFAIK 的最佳机会