我正在嘗試構建某種網站狀態檢查器。我發現 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 https://www.hetzner.com
可能是什么原因?我如何從 golang HTTP 解決這個問題?
uj5u.com熱心網友回復:
您可以通過指定 HTTP User-Agent 標頭來修復您的特定情況:
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 保護您的目標網站,盡管狀態代碼為 200,您的 HTTP 請求仍將被阻止。要處理此問題,您需要構建能夠呈現基于 JavaScript 的網站并添加一些腳本來決議驗證碼的東西。
此外,如果您在短時間內檢查大量網站,您將被您的 DNS 服務器阻止,因為它們有一些內置速率限制。在這種情況下,您可能需要查看 massdns 或類似的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/505187.html
