Go 中的 http 请求为什么会返回
<html><body><h1>503</h1></body></html>
但我可以毫无问题地卷曲 url/数据。 例如卷曲https://www.elastic.co/downloads/elasticsearch
示例代码:
func main() {
url := "https://www.elastic.co/downloads/elasticsearch"
data := DownloadData(url)
fmt.Println(data)
}
func DownloadData(url string) string {
response, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
data, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
dir := string(data)
return dir
}
答案 0 :(得分:0)
因此,elastic.co 可能正在检查用户代理以阻止抓取工具抓取他们的网站。一旦没有用户代理标头或标头暗示您正在自动化流量,他们的机器人检测系统就会启动,您将收到 503 . 下面是您的代码与使用 Firefox 用户代理的示例。一旦你运行它,你就会得到像 curl 一样的 body。
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
url := "https://elastic.co/downloads/elasticsearch,"
data := DownloadData(url)
fmt.Println(data)
}
func DownloadData(url string) string {
client := &http.Client{}
request, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatalln(err)
}
request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0")
response, err := client.Do(request)
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
data, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
dir := string(data)
return dir
}