Go语言如何正确获取URL页面内容?10次重定向报错怎么解决
问题原因
- 你直接调用的
http.Get底层使用Go全局默认的http.DefaultClient,该客户端默认最多允许跟随10次重定向,超过次数就会抛出stopped after 10 redirects错误。 - 速卖通俄站的反爬机制会对未携带标准浏览器请求头的请求返回循环重定向响应,你的原始代码没有加任何请求头,被识别为爬虫触发了循环重定向,自然就超过了默认的10次限制。
- 浏览器和Postman请求正常,是因为它们会自动携带
User-Agent、Accept等标准请求头,不会被判定为异常请求,也就不会触发循环重定向逻辑。
解决方法
你需要自定义http.Client,调整重定向策略,同时补充必要的请求头即可解决问题:
方案1:调整重定向次数限制+模拟浏览器请求头
大多数场景下只要添加标准请求头就能避免循环重定向,同时可以根据需求调高最大重定向次数:
package main import ( "fmt" "io" "net/http" ) func main() { // 自定义http客户端 client := &http.Client{ // 调整最大重定向次数为30次,可根据实际情况调整 CheckRedirect: func(req *http.Request, via []*http.Request) error { if len(via) >= 30 { return http.ErrUseLastResponse } return nil }, } // 构造请求,添加请求头 req, err := http.NewRequest("GET", "https://aliexpress.ru/item/4001275226820.html", nil) if err != nil { panic(err) } // 模拟Chrome浏览器的User-Agent,可替换为你自己浏览器的实际UA req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36") // 添加Accept头,模拟浏览器正常请求 req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9") resp, err := client.Do(req) if err != nil { panic(err) } defer resp.Body.Close() // Go 1.16之后推荐用io.ReadAll替代ioutil.ReadAll,功能完全一致 html, err := io.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Printf("%s\n", html) }
方案2:直接禁用自动重定向
如果你不需要跟随重定向,可以直接设置CheckRedirect返回http.ErrUseLastResponse,直接拿到重定向响应自行处理:
client := &http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }, }
其他注意事项
如果添加UA后还是触发重定向,可以把你浏览器请求该页面时携带的Cookie、Accept-Language等头也加到请求里,和浏览器请求参数保持一致即可。
内容的提问来源于stack exchange,提问作者Billizzard
相关产品推荐
相关产品推荐

