gpt4 book ai didi

http - 为什么我尝试使用 "net/http: request canceled while waiting for connection"获取一些图像时得到 "net/http"

转载 作者:IT王子 更新时间:2023-10-29 01:12:17 25 4
gpt4 key购买 nike

我正在用 Go 语言编写一个网络爬虫来收集互联网上的图像。我的抓取工具大部分时间都在工作,但有时无法以某种方式获取图像。

这是我的片段:

package main

import (
"fmt"
"net/http"
"time"
)

func main() {
var client http.Client
var resp *http.Response

// var imageUrl = "/image/tKsDb.png" // It works well
var imageUrl = "https://precious.jp/mwimgs/b/1/-/img_b1ec6cf54ff3a4260fb77d3d3de918a5275780.jpg" // It fails

req, _ := http.NewRequest("GET", imageUrl, nil)
req.Header.Add("User-Agent", "My Test")

client.Timeout = 3 * time.Second
resp, err := client.Do(req)
if err != nil {
fmt.Println(err.Error()) // Fails here
return
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
fmt.Printf("Failure: %d\n", resp.StatusCode)
} else {
fmt.Printf("Success: %d\n", resp.StatusCode)
}

fmt.Println("Done")
}

我上面的代码片段适用于大多数 URL(例如“/image/tKsDb.png”),但如果它试图获取诸如“https://precious.jp/mwimgs/b/1/-/img_b1ec6cf54ff3a4260fb77d3d3de918a5275780.jpg”的 URL,它就不起作用。调用 err.Error() 给出的错误信息是:

Get https://precious.jp/mwimgs/b/1/-/img_b1ec6cf54ff3a4260fb77d3d3de918a5275780.jpg: net/http: request canceled (Client.Timeout exceeded while awaiting headers)"

我的 Go 版本是“go1.9.3 darwin/amd64”,我可以用我的谷歌浏览器和 curl 命令获取图像,所以我不认为我被阻止了我的 IP 地址。除此之外,我已经将 User-Agent 更改为像真正的浏览器一样,但仍然不走运。

我的代码有什么问题?还是 precious.jp 的管理员施了魔法来阻止我的访问?

最佳答案

由于您使用的是 https,因此您需要使用自定义 transport 创建 http.Client 并配置 TLS(参见 http.Transport),例如

package main

import (
"crypto/tls"
"fmt"
"net/http"
"time"
)

func main() {
//---------------------- Modification ----------------------
//Configure TLS, etc.
tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}
client := &http.Client{
Transport: tr,
Timeout: 3 * time.Second,
}
//---------------------- End of Modification ----------------

// var imageUrl = "/image/tKsDb.png" // It works well
var imageUrl = "https://precious.jp/mwimgs/b/1/-/img_b1ec6cf54ff3a4260fb77d3d3de918a5275780.jpg" // It fails

req, _ := http.NewRequest("GET", imageUrl, nil)
req.Header.Add("User-Agent", "My Test")

resp, err := client.Do(req)
if err != nil {
fmt.Println(err.Error()) // Fails here
return
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
fmt.Printf("Failure: %d\n", resp.StatusCode)
} else {
fmt.Printf("Success: %d\n", resp.StatusCode)
}

fmt.Println("Done")
}

关于http - 为什么我尝试使用 "net/http: request canceled while waiting for connection"获取一些图像时得到 "net/http",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48517410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com