【问题标题】:Golang Http Get Request very slowGolang Http 获取请求很慢
【发布时间】:2019-01-26 03:38:55
【问题描述】:

我在 Golang 中的一个简单的 HTTP 获取请求有一个非常奇怪的问题。

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))
}

【问题讨论】:

  • 您的代码未显示任何时间测量值。你是如何确定需要这么长时间的?您是否尝试设置适当的标头(例如 Accept、User-Agent 等)?
  • 您可以使用httptrace package 找出请求的哪一部分是慢的。
  • 您来自 Chrome 的请求可以从缓存中处理。在进行比较之前,请确保您拥有disabled cache
  • 只是添加更多细节:wireshark 中的跟踪清楚地表明问题是服务器仅在一段时间后才响应。此外,curl 和 perl LWP::Simple 也会出现同样的问题。鉴于该站点落后于 Akamai CDN 并且 Akamai 正在提供反僵尸程序措施,我的猜测是,当站点检测到看起来不像典型浏览器的客户端时,这是该站点执行的显式减速。这很可能是为了防止自动抓取信息。

标签: performance http go get request


【解决方案1】:

您尝试访问的网站位于 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 certificateScraping attempts getting 403 error可以看出,这种检测主要关心有一个Accept-Language标头,有一个Connection标头的值为Keep-Alive,以及有一个与@匹配的User-Agent 987654328@。

这意味着以下代码更改会导致立即响应:

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 完成的机器人检测可能会在没有通知的情况下发生更改,即即使此代码现在解决了问题,它也可能在未来不再起作用。如果许多客户端绕过机器人检测,此类更改尤其如此。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的想法。解决方案与@Volker的命题有关 相关标题是:Accept ==> text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
    猜你喜欢
    • 2018-06-28
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2014-10-18
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多