Golang Http Get请求很慢

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)

Ste*_*ich 9

您尝试访问的站点位于 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 执行的机器人检测可能会在没有通知的情况下更改,即即使此代码现在解决了问题,将来也可能不再起作用。如果许多客户端绕过机器人检测,此类更改将尤其如此。


小智 -2

尝试禁用 chrome 中的缓存并与 golang 进行比较