对于Golang中的一个简单的HTTP请求,我有一个非常奇怪的问题。
戈朗对https://www.alltron.ch/json/searchSuggestion?searchTerm=notebook的每一个请求大约需要6-8秒(!)
如果在Chrome、邮递员或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))
}
发布于 2019-01-25 19:38:55
您要访问的站点位于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为其客户提供了一个网络客户端的检测,而这些客户端不是浏览器,这样客户就可以让机器人远离或减慢机器人的速度。
从Strange CURL issue with a particular website SSL certificate和Scraping attempts getting 403 error中可以看出,这种检测主要关注的是有一个Accept-Language
头、一个带有值Keep-Alive
的Connection
头以及一个与Mozilla/...
匹配的User-Agent
。
这意味着以下代码更改将导致立即响应:
req, _ := http.NewRequest("GET", "https://www.alltron.ch/json/searchSuggestion?searchTerm=notebook", nil)
req.Header.Set("Connection","Keep-Alive")
req.Header.Set("Accept-Language","en-US")
req.Header.Set("User-Agent","Mozilla/5.0")
尽管如此,该网站显然不喜欢机器人,你应该坚持这些愿望,不要过分强调网站(比如做大量的信息抓取)。而且,Akamai所做的机器人检测可能会在没有通知的情况下发生变化,也就是说,即使这段代码解决了问题,现在它可能在将来不再起作用了。如果许多客户端绕过bot检测,这种更改将特别正确。
发布于 2019-01-25 12:15:33
尝试在你的铬中禁用高速缓存,并将其与戈朗进行比较。
https://stackoverflow.com/questions/54363393
复制相似问题