const proxyServer = "http-dyn.abuyun.com:9020"
// 代理隧道验证信息
const proxyUser = "H8K54D3646J2X67D";
const proxyPass = "C6228A18B130EF63";
type AbuyunProxy struct {
AppID string
AppSecret string
}
func (p AbuyunProxy) ProxyClient() http.Client {
proxyUrl, _ := url.Parse("http://"+ p.AppID +":"+ p.AppSecret +"@"+ proxyServer)
return http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
}
func main() {
targetUrl := "https://anime-pictures.net/pictures/download_image/640247-5528x3508-kimetsu+no+yaiba-uzui+tengen-mikki-single-short+hair-highres.png"
// 初始化 proxy http client
client := AbuyunProxy{AppID: proxyUser, AppSecret: proxyPass}.ProxyClient()
request, _ := http.NewRequest("GET", targetUrl, bytes.NewBuffer([]byte(``)))
response, err := client.Do(request)
if err != nil {
panic("failed to connect: " + err.Error())
}
/*response, err := http.Get(targetUrl)
if err != nil{
fmt.Println("请求图片 url 失败",err)
}*/
fmt.Println(response)
defer response.Body.Close()
name := "./H_1.jpg"
out, err := os.Create(name)
if err != nil{
fmt.Println("创建文件失败",err)
}
defer out.Close()
pix, err := ioutil.ReadAll(response.Body)
if err != nil{
fmt.Println(err)
}
_, err = io.Copy(out, bytes.NewReader(pix))
if err != nil {
fmt.Println("下载文件失败",err)
}
}
各位大佬帮忙看一下,我用代理返回的 status 是 200,但是 ioutil.ReadAll 读取会出现 unexpected EOF 错误,后面我又用了上面注释的 http.Get 请求,ioutil.ReadAll 读取是可以保存图片的,但是 http.Get 请求和代理请求都是 status,为什么代理不能被 ioutil.ReadAll 读取呢,上面代理用的是阿布云的代理,测试账号已经是过期的
1
Fitz 2020-04-01 11:47:15 +08:00 1
几个问题
1. http.Get 会使用 DefaultClient, 根本就不走代理, 你需要用 client.Get 2. err != nil 你需要处理 而不是打印一下就继续往下执行 3. io.copy 不是直接可以把 body 的数据写入到 os file 中吗, `_, err = io.Copy(out, response.Body)` 绕这么大一圈创建 pix 是干什么呢 4. "但是 http.Get 请求和代理请求都是 status" 这是什么意思 5. err 都处理下, 不要用下划线忽略 unexpected EOF 一般是在读取固定长度的时候没读够才会出现的, readall 应该不会出现吧, 你这个图片太大了, 我用本地的代理试了下其他图片没什么问题 |
2
347443579 OP @Fitz 第一个问题,我的意思是注释的那段 http.Get 可以保存图片,用代理不行,第二个打印一下继续执行,因为我做的是爬虫,不可能中断,重新记录这条记录太麻烦了,打印错误,直接抛弃往下执行,第三个问题,我也不知道为什么要读取,我在网上找的 go 下载网络图片都有这个步骤,我 go 刚学没多久,一直断断续续的,只能照抄,第四个我的错,没讲清楚,意思是返回的 http 的 status 都是 200,也就是成功了,返回都成功了,代理的 response.Body 读取不了,注释的哪个 http.Get 返回的 response.Body 却能保存
|
3
Fitz 2020-04-01 19:44:01 +08:00
大概率是代理服务器有问题
|
4
ljy1398202806 2020-04-02 14:58:03 +08:00
@Fitz 初学 go,err 都处理感觉特别麻烦,而且代码看着全是判断错误,这个有很大的好处么。。一些自己判断基本不会出错的代码可不可以忽略掉 err
|
5
347443579 OP @ljy1398202806 就 err 垃圾,其他的 go 完爆所有!!
|
6
Fitz 2020-04-02 15:39:24 +08:00
@ljy1398202806 没办法, 当初创造 golang 的几个人都是 unix 时代的遗老遗少, 按照官方的说法就是"像 try-cache 那样将异常耦合在控制结构中会导致代码混乱".
太多重复的 err 判断一直是 go 广受诟病的三大问题之一,另两个是包管理和泛型,而且自从 try 提案被否决, 关于错误处理基本不会再有改进了, 按 russ cox 的话就是再等个十年..... |
7
Fitz 2020-04-02 15:42:25 +08:00
艹 怎写成 try-cache 了😂
|
8
ljy1398202806 2020-04-02 16:15:30 +08:00
@Fitz 谢谢大佬
|