猿问

Golang HTTP Get 请求未解析某些 URL

我试图建立某种网站状态检查器。我发现对于https://www.hetzner.com之类的某些 URL,golang HTTP get 请求未得到解决并永远挂起。但是,如果我们 curl,则相同的 URL 会起作用。


戈朗


这里没有抛出错误。它只是挂在http.Get上


func main() {

  resp, err := http.Get("https://www.hetzner.com")

  if err != nil {

        fmt.Println("Error while retrieving site", err)

  }

  defer resp.Body.Close()

  body, err := io.ReadAll(resp.Body)

    if err != nil {

      fmt.Println("Eroor while reading response body", err)

  }

  fmt.Println("RESPONSE", string(body))}

卷曲


我在运行以下命令时得到响应。


curl https://www.hetzner.com

可能是什么原因?我如何从 golang HTTP 解决这个问题?


拉风的咖菲猫
浏览 139回答 1
1回答

慕容708150

您可以通过指定 HTTP User-Agent Header 来解决您的具体情况:import (    "fmt"    "io"    "net/http")func main() {    client := &http.Client{}    req, err := http.NewRequest("GET", "https://www.hetzner.com", nil)    if err != nil {        fmt.Println("Error while retrieving site", err)    }    req.Header.Set("User-Agent", "Golang_Spider_Bot/3.0")    resp, err := client.Do(req)    if err != nil {        fmt.Println("Error while retrieving site", err)    }    defer resp.Body.Close()    body, err := io.ReadAll(resp.Body)    if err != nil {        fmt.Println("Eroor while reading response body", err)    }    fmt.Println("RESPONSE", string(body))}注意:许多其他主机会因为他们的一些安全规则而拒绝来自您的服务器的请求。一些想法:空的或类似机器人的 User-Agent HTTP 标头您的 IP 地址所在的位置。例如,美国的在线商店不需要处理来自俄罗斯的请求。供应商的自治系统或 CIDR。由于其居民的大量恶意活动,一些 ASN 完全被黑洞。注 2:许多现代网站前面都有 DDoS 保护或 CDN 系统。如果 Cloudflare 保护您的目标网站,您的 HTTP 请求将被阻止,尽管状态代码为 200。要处理此问题,您需要构建能够呈现基于 JavaScript 的网站并添加一些脚本来解析验证码的东西。此外,如果您在短时间内检查大量网站,您将被您的 DNS 服务器阻止,因为它们有一些内置速率限制。在这种情况下,您可能需要查看 massdns 或类似的解决方案。
随时随地看视频慕课网APP

相关分类

Go
我要回答