插件窝 干货文章 Go-rod库如何获取a标签点击后返回的JSON响应?

Go-rod库如何获取a标签点击后返回的JSON响应?

响应 点击 网络 请求 264    来源:    2025-03-15

在使用 go-rod 库时,如果你想要获取点击 <a> 标签后返回的 JSON 响应,你可以通过以下步骤来实现:

  1. 启动浏览器并导航到目标页面:首先,你需要启动一个浏览器实例并导航到你想要操作的页面。

  2. 找到并点击 <a> 标签:使用 go-rod 提供的选择器功能找到你想要点击的 <a> 标签,并模拟点击操作。

  3. 监听网络请求:在点击 <a> 标签之前,设置一个网络监听器来捕获页面发出的网络请求。

  4. 获取 JSON 响应:在网络监听器中,检查每个请求的响应,找到你感兴趣的 JSON 响应并提取出来。

以下是一个示例代码,展示了如何实现上述步骤:

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/go-rod/rod"
    "github.com/go-rod/rod/lib/proto"
)

func main() {
    // 启动浏览器
    browser := rod.New().MustConnect()
    defer browser.MustClose()

    // 创建一个新页面
    page := browser.MustPage("https://example.com")

    // 设置网络监听器
    wait := page.WaitRequestIdle()
    page.MustWaitLoad()

    // 找到并点击 <a> 标签
    page.MustElement("a").MustClick()

    // 等待网络请求完成
    wait()

    // 监听网络响应
    page.EachEvent(func(e *proto.NetworkResponseReceived) {
        // 检查响应类型是否为 JSON
        if e.Response.MimeType == "application/json" {
            // 获取响应体
            body, err := proto.NetworkGetResponseBody{RequestID: e.RequestID}.Call(page)
            if err != nil {
                log.Fatalf("Failed to get response body: %v", err)
            }

            // 打印 JSON 响应
            fmt.Println(string(body))
        }
    })

    // 等待一段时间以确保所有请求都被处理
    time.Sleep(5 * time.Second)
}

代码说明:

  1. 启动浏览器并导航到目标页面:使用 rod.New().MustConnect() 启动浏览器,并使用 MustPage 导航到目标页面。

  2. 找到并点击 <a> 标签:使用 MustElement 找到 <a> 标签,并使用 MustClick 模拟点击操作。

  3. 设置网络监听器:使用 WaitRequestIdle 等待网络请求完成,并使用 EachEvent 监听网络响应。

  4. 获取 JSON 响应:在网络监听器中,检查每个响应的 MIME 类型是否为 application/json,如果是,则使用 NetworkGetResponseBody 获取响应体并打印出来。

注意事项:

  • 你需要确保 <a> 标签的点击确实会触发一个网络请求,并且该请求返回的是 JSON 数据。
  • 如果页面中有多个 JSON 响应,你可能需要根据 URL 或其他条件进一步过滤。
  • WaitRequestIdle 会等待所有网络请求完成,确保你在点击后等待足够的时间来捕获响应。

通过这种方式,你可以在 go-rod 中获取点击 <a> 标签后返回的 JSON 响应。