在Golang中使用简单的HTTP Get Request遇到一个非常奇怪的问题。
Golang中对 https://www.alltron.ch/json/searchSuggestion?searchTerm=notebook 的每个请求大约需要6-8秒(!)
如果在 Chrome,Postman或Powershell 中触发了相同的请求,则所需时间不到一秒钟。
有人知道为什么会这样吗?
我的代码:
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
client := &http.Client{}
req, _ := http.NewRequest("GET", "https://www.alltron.ch/json/searchSuggestion?searchTerm=notebook", nil)
response, err := client.Do(req)
if err != nil && response == nil {
log.Fatalf("Error on request. %v", err)
}
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatalf("Couldn't get response body. %v", err)
}
fmt.Print(string(body))
}
答案 0 :(得分:3)
您要访问的网站位于Akamai CDN后面:
$ dig www.alltron.ch
...
www.alltron.ch. 152 IN CNAME competec.botmanager.edgekey.net.
competec.botmanager.edgekey.net. 7052 IN CNAME e9179.f.akamaiedge.net.
e9179.f.akamaiedge.net. 162 IN A 2.20.176.40
Akamai向其客户提供不是浏览器的Web客户端检测,以便客户可以使僵尸程序远离或降低僵尸程序的速度。
从Strange CURL issue with a particular website SSL certificate和Scraping attempts getting 403 error可以看出,这种类型的检测主要关心的是拥有Accept-Language
报头,具有值为{{1}的Connection
报头},并有一个与Keep-Alive
相匹配的User-Agent
。
这意味着以下代码更改会导致立即响应:
Mozilla/...
仍然,该网站显然不喜欢漫游器,您应该遵守这些愿望,并且不要过分强调该网站(例如进行大量信息收集)。而且,由Akamai完成的僵尸程序检测可能会更改,恕不另行通知,即,即使此代码现在解决了问题,将来也可能不再起作用。如果许多客户端绕过了僵尸程序检测,则此类更改将尤其如此。
答案 1 :(得分:-1)
尝试禁用Chrome中的缓存并与golang进行比较