Golang的Http Get请求非常缓慢。

5

我在使用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))
}

1
你的代码没有显示任何时间测量。你是如何确定它需要那么长时间的?你尝试设置适当的头部信息了吗(例如:接受、用户代理等)? - Volker
2
你可以使用 httptrace 包 来找出请求中哪一部分比较慢。 - Peter
1
你在Chrome中的请求可能已被缓存处理。在进行比较之前,请确保禁用了缓存 - zdebra
2
只是为了添加更多细节:Wireshark中的跟踪清楚地显示问题是服务器只在一段时间后回答。此外,使用curl和perl LWP :: Simple也会出现相同的问题。鉴于该站点位于Akamai CDN后面,并且Akamai提供反机器人措施,我猜测这是一个明确的减速,当它检测到不像典型浏览器的客户端时,该站点会执行此操作。这很可能是为了保护信息免受自动化抓取的侵害。 - Steffen Ullrich
2个回答

10

您正在尝试访问的网站位于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头、具有值为Keep-AliveConnection头以及User-AgentMozilla/...匹配。

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

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 - pitw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接