You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang请求Pokemon Center接口遭Incapsula拦截问题求助

解决Pokemon Center官网Incapsula拦截的Golang请求问题

我尝试请求Pokemon Center官网的某商品页面,浏览器清除Cookie后首次访问会收到Set Cookie响应(无HTML内容),页面重载携带Cookie后就能成功获取实际HTML。但用Golang复现这个流程时遇到问题:第一次请求返回200状态码和Set Cookie,第二次带Cookie的请求却还是返回同样的Set Cookie响应,拿不到HTML。

查看开发者工具发现,首次和二次请求之间还有一系列请求,这应该是Incapsula反爬拦截导致的。附上相关请求截图:

  • 首次无Cookie请求截图:首次无Cookie请求截图
  • 二次带Cookie请求截图:二次带Cookie请求截图

我的Golang代码如下:

func FetchPokemonURL(client *http.Client, productUrl string, firstTry bool) (string, bool, string) {
    req, err := http.NewRequest("GET", productUrl, nil)
    if err != nil {
        return "", false, "Failed to create request: " + err.Error()
    }

    req.Header.Set("Host", "www.pokemoncenter.com")
    req.Header.Set("Sec-Fetch-Dest", "document")
    req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0.1 Safari/605.1.15")
    req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    if firstTry {
        req.Header.Set("Sec-Fetch-Site", "none")
    } else {
        req.Header.Set("Sec-Fetch-Site", "same-origin")
    }
    req.Header.Set("Sec-Fetch-Mode", "navigate")
    if !firstTry {
        req.Header.Set("Referer", productUrl)
        req.Header.Set("Cache-Control", "max-age=0")
    }
    req.Header.Set("Accept-Language", "en-US,en;q=0.9")
    req.Header.Set("Priority", "u=0, i")
    req.Header.Set("Accept-Encoding", "gzip, deflate, br")
    req.Header.Set("Connection", "keep-alive")

    resp, err := client.Do(req)
    if err != nil {
        return "", false, fmt.Sprintf("Error making request: %v\n", err)
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return "", false, fmt.Sprintf("Error reading response body: %v\n", err)
    }
    strBody := string(body)

    if firstTry {
        return FetchPokemonURL(client, productUrl, false)
    } else {
        return strBody, false, ""
    }
}

解决方法

1. 启用CookieJar自动管理Cookie

默认http.Client没有启用Cookie存储,导致第一次请求的Cookie无法被后续请求携带。初始化客户端时添加CookieJar:

import "net/http/cookiejar"

jar, err := cookiejar.New(&cookiejar.Options{})
if err != nil {
    // 处理错误
}
client := &http.Client{Jar: jar}

2. 自动处理重定向

Incapsula会触发多次重定向验证,手动调用两次请求跳过了中间步骤。让客户端自动处理重定向,可自定义重定向策略避免无限循环:

client := &http.Client{
    Jar: jar,
    CheckRedirect: func(req *http.Request, via []*http.Request) error {
        if len(via) >= 10 { // 限制最大重定向次数
            return fmt.Errorf("too many redirects")
        }
        return nil
    },
}

3. 补充缺失的浏览器请求头

Incapsula会验证完整的请求头,补充浏览器会发送的Sec-Fetch-User、DNT等字段:

req.Header.Set("Sec-Fetch-User", "?1")
req.Header.Set("DNT", "1")

4. 模拟浏览器的完整请求流程

如果上述方法无效,说明需要执行JS生成验证参数,此时建议使用无头浏览器库(如chromedp或playwright-go)直接模拟浏览器行为,自动处理JS验证和Cookie流程。


修正后的完整代码示例

import (
    "fmt"
    "io"
    "net/http"
    "net/http/cookiejar"
)

func FetchPokemonURL(productUrl string) (string, error) {
    // 初始化带CookieJar的客户端
    jar, err := cookiejar.New(&cookiejar.Options{})
    if err != nil {
        return "", fmt.Errorf("failed to create cookie jar: %v", err)
    }

    client := &http.Client{
        Jar: jar,
        CheckRedirect: func(req *http.Request, via []*http.Request) error {
            if len(via) >= 10 {
                return fmt.Errorf("too many redirects")
            }
            return nil
        },
    }

    req, err := http.NewRequest("GET", productUrl, nil)
    if err != nil {
        return "", fmt.Errorf("failed to create request: %v", err)
    }

    // 完整模拟Safari浏览器请求头
    req.Header.Set("Host", "www.pokemoncenter.com")
    req.Header.Set("Sec-Fetch-Dest", "document")
    req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0.1 Safari/605.1.15")
    req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    req.Header.Set("Sec-Fetch-Site", "none")
    req.Header.Set("Sec-Fetch-Mode", "navigate")
    req.Header.Set("Sec-Fetch-User", "?1")
    req.Header.Set("Accept-Language", "en-US,en;q=0.9")
    req.Header.Set("Priority", "u=0, i")
    req.Header.Set("Accept-Encoding", "gzip, deflate, br")
    req.Header.Set("Connection", "keep-alive")
    req.Header.Set("DNT", "1")

    resp, err := client.Do(req)
    if err != nil {
        return "", fmt.Errorf("error making request: %v", err)
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return "", fmt.Errorf("error reading response body: %v", err)
    }

    return string(body), nil
}

内容的提问来源于stack exchange,提问作者Ahmed Zaidan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:50:55