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请求截图:

我的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
相关产品推荐
相关产品推荐

