我的目标是抓取一个需要我首先使用 Golang 中的 HTTP 请求登录的网站。实际上,我成功地发现我可以向网站发送一个发布请求,将表单数据写入请求的正文中。当我通过我使用的名为 Postman 的 API 开发软件进行测试时,响应是即时的,没有延迟。但是,在 Go 中使用 HTTP 客户端执行请求时,每次都会有 60 秒的延迟。我最终得到了一个登录页面,但对于我的程序,我需要几乎是即时的响应。
正如您在我的代码中看到的那样,我尝试向请求中添加一堆 header ,例如“Connection”、“Content-Type”、“User-Agent”,因为我认为网站可以告诉我正在从程序并迫使我等待 60 秒以等待响应。添加这些 header 以使我的请求更合法(?)根本不起作用。
来自 Go 的 HTTP 客户端的延迟是慢还是我如何形成我的 HTTP POST 请求有问题?另外,我是否对我的 header 进行了处理,并且 HTTP 客户端在它们发送时正在重写它们?
这是我的简单程序...
package main
import (
"bytes"
"fmt"
"mime/multipart"
"net/http"
"net/http/cookiejar"
"os"
)
func main() {
url := "https://easypronunciation.com/en/log-in"
method := "POST"
payload := &bytes.Buffer{}
writer := multipart.NewWriter(payload)
_ = writer.WriteField("email", "foo@bar.com")
_ = writer.WriteField("password", "*********")
_ = writer.WriteField("persistent_login", "on")
_ = writer.WriteField("submit", "")
err := writer.Close()
if err != nil {
fmt.Println(err)
}
cookieJar, _ := cookiejar.New(nil)
client := &http.Client{
Jar: cookieJar,
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
}
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("Connection", "Keep-Alive")
req.Header.Set("Accept-Language", "en-US")
req.Header.Set("User-Agent", "Mozilla/5.0")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
}
defer res.Body.Close()
f, err := os.Create("response.html")
defer f.Close()
res.Write(f)
}
最佳答案
我怀疑,这也是 Go 客户端库。我建议打印出不同组件的延迟,看看 60 秒延迟是否/在哪里。我也会替换并尝试不同的 URL
关于http - 为什么在使用 Go HTTP 客户端时我的 HTTP POST 请求会有 60 秒的延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63475918/