为了账号安全,请及时绑定邮箱和手机立即绑定

Golang HTTP Get 请求未解析某些 URL

Golang HTTP Get 请求未解析某些 URL

Go
拉风的咖菲猫 2023-02-06 11:24:17
我试图建立某种网站状态检查器。我发现对于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 解决这个问题?
查看完整描述

1 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

您可以通过指定 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 或类似的解决方案。


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信