pit*_*itw 5 performance get http request go
我在 Golang 中的一个简单的 HTTP Get 请求有一个非常奇怪的问题。
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))
}
Run Code Online (Sandbox Code Playgroud)
您尝试访问的站点位于 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
Run Code Online (Sandbox Code Playgroud)
Akamai 为其客户提供对非浏览器的 Web 客户端的检测,以便客户可以将机器人拒之门外或减慢机器人的速度。
从带有特定网站 SSL 证书的 Strange CURL 问题和Scraping 尝试获得 403 错误可以看出,这种检测主要关心具有Accept-Language标头、具有Connection值的标头Keep-Alive和具有User-Agent匹配的Mozilla/...。
这意味着以下代码更改会导致立即响应:
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")
Run Code Online (Sandbox Code Playgroud)
尽管如此,该网站显然不喜欢机器人,你应该坚持这些愿望,不要给网站带来太多压力(比如做大量的信息抓取)。而且,Akamai 执行的机器人检测可能会在没有通知的情况下更改,即即使此代码现在解决了问题,将来也可能不再起作用。如果许多客户端绕过机器人检测,此类更改将尤其如此。
| 归档时间: |
|
| 查看次数: |
2648 次 |
| 最近记录: |