插件窝 干货文章 Go-rod库:如何拦截a标签请求并获取其JSON响应?

Go-rod库:如何拦截a标签请求并获取其JSON响应?

拦截 请求 响应 等待 660    来源:    2025-03-15

在使用 go-rod 库时,你可以通过拦截网络请求来获取特定 a 标签点击后返回的 JSON 响应。go-rod 提供了强大的网络拦截功能,允许你在页面加载或用户交互时捕获和处理网络请求。

以下是一个示例代码,展示了如何拦截 a 标签的请求并获取其 JSON 响应:

package main

import (
    "fmt"
    "log"
    "time"

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

func main() {
    // 启动浏览器
    url := launcher.New().Headless(true).MustLaunch()
    browser := rod.New().ControlURL(url).MustConnect()
    defer browser.MustClose()

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

    // 启用网络拦截
    router := page.HijackRequests()
    defer router.MustStop()

    // 拦截特定请求
    router.MustAdd("*.json", func(ctx *rod.Hijack) {
        // 继续请求
        ctx.ContinueRequest(&proto.FetchContinueRequest{})

        // 等待响应
        response := ctx.Response()

        // 读取响应体
        body, err := response.Body()
        if err != nil {
            log.Fatalf("Failed to read response body: %v", err)
        }

        // 打印 JSON 响应
        fmt.Println("JSON Response:", string(body))
    })

    // 开始拦截
    go router.Run()

    // 等待页面加载完成
    page.MustWaitLoad()

    // 点击页面上的 a 标签
    page.MustElement("a").MustClick()

    // 等待一段时间以确保请求完成
    time.Sleep(5 * time.Second)
}

代码说明:

  1. 启动浏览器:使用 launcher 启动一个无头浏览器实例,并通过 rod.New().ControlURL(url).MustConnect() 连接到浏览器。

  2. 创建页面:使用 browser.MustPage("https://example.com") 创建一个新页面并导航到目标 URL。

  3. 启用网络拦截:通过 page.HijackRequests() 启用网络请求拦截功能。

  4. 拦截特定请求:使用 router.MustAdd("*.json", func(ctx *rod.Hijack) { ... }) 拦截所有以 .json 结尾的请求。在回调函数中,你可以继续请求并获取响应体。

  5. 点击 a 标签:使用 page.MustElement("a").MustClick() 点击页面上的 a 标签,触发请求。

  6. 等待请求完成:使用 time.Sleep(5 * time.Second) 等待一段时间,以确保请求完成并捕获到响应。

注意事项:

  • 你需要根据实际情况调整拦截的 URL 模式(如 *.json)。
  • 如果页面上的 a 标签是通过 JavaScript 动态加载的,你可能需要在点击之前等待元素加载完成。
  • 如果请求是通过 AJAX 或其他异步方式触发的,你可能需要调整等待时间或使用更复杂的逻辑来确保捕获到响应。

通过这种方式,你可以轻松地拦截 a 标签的请求并获取其 JSON 响应。