curl Golang HTTP Get请求未解析为某个URL

u3r8eeie  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(159)

我试着建立一些网站状态检查器。我发现golang HTTP get请求没有被解析,并且对于一些URL(如**https://www.hetzner.com)永远挂起。但是如果我们使用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 度**

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

curl https://www.hetzner.com

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

70gysomp

70gysomp1#

您可以通过指定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))
}

**注意:**许多其他主机会拒绝来自您的服务器的请求,因为它们的一些安全规则。一些想法:

  • 空的或类似bot的User-Agent HTTP标头
  • 您的IP地址的位置。例如,在美国的网上商店不需要处理来自俄罗斯的请求。
  • 自治系统或CIDR。一些ASN由于其驻留者的大量恶意活动而完全被黑洞化。
    **注2:**许多现代网站都有DDoS保护或CDN系统。如果Cloudflare保护您的目标网站,您的HTTP请求将被阻止,尽管状态代码为200。要处理此问题,您需要构建能够渲染基于JavaScript的网站的东西,并添加一些脚本来解析验证码。

另外,如果你在短时间内检查了大量的网站,你会被你的DNS服务器阻止,因为它们有一些内置速率限制。在这种情况下,你可能需要看看massdns或类似的解决方案。

相关问题