V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
347443579
V2EX  ›  Go 编程语言

go 代理问题

  •  1
     
  •   347443579 · 2020-04-01 10:30:32 +08:00 · 2115 次点击
    这是一个创建于 1702 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 条附言  ·  2020-04-01 18:05:26 +08:00
    这个是我爬虫代码中的一个代理抽出来测试的,遇到的问题是 http.Get 请求的数据可以保存,代理请求的数据保存失败,2 个请求返回都成功了,为什么一个可以读取保存,一个保存不了,楼下老哥说的 io.copy 可以直接保存,我打算试试,但是估计可能会失败,因为我是 fmt 打印错误的,也就是说错误打印了会往下走,但是每次保存错误的图片打开都是一张交叉的错误提示的空白图片
    8 条回复    2020-04-02 16:15:30 +08:00
    Fitz
        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 应该不会出现吧, 你这个图片太大了, 我用本地的代理试了下其他图片没什么问题
    347443579
        2
    347443579  
    OP
       2020-04-01 17:55:55 +08:00
    @Fitz 第一个问题,我的意思是注释的那段 http.Get 可以保存图片,用代理不行,第二个打印一下继续执行,因为我做的是爬虫,不可能中断,重新记录这条记录太麻烦了,打印错误,直接抛弃往下执行,第三个问题,我也不知道为什么要读取,我在网上找的 go 下载网络图片都有这个步骤,我 go 刚学没多久,一直断断续续的,只能照抄,第四个我的错,没讲清楚,意思是返回的 http 的 status 都是 200,也就是成功了,返回都成功了,代理的 response.Body 读取不了,注释的哪个 http.Get 返回的 response.Body 却能保存
    Fitz
        3
    Fitz  
       2020-04-01 19:44:01 +08:00
    大概率是代理服务器有问题
    ljy1398202806
        4
    ljy1398202806  
       2020-04-02 14:58:03 +08:00
    @Fitz 初学 go,err 都处理感觉特别麻烦,而且代码看着全是判断错误,这个有很大的好处么。。一些自己判断基本不会出错的代码可不可以忽略掉 err
    347443579
        5
    347443579  
    OP
       2020-04-02 15:11:40 +08:00
    @ljy1398202806 就 err 垃圾,其他的 go 完爆所有!!
    Fitz
        6
    Fitz  
       2020-04-02 15:39:24 +08:00
    @ljy1398202806 没办法, 当初创造 golang 的几个人都是 unix 时代的遗老遗少, 按照官方的说法就是"像 try-cache 那样将异常耦合在控制结构中会导致代码混乱".

    太多重复的 err 判断一直是 go 广受诟病的三大问题之一,另两个是包管理和泛型,而且自从 try 提案被否决, 关于错误处理基本不会再有改进了, 按 russ cox 的话就是再等个十年.....
    Fitz
        7
    Fitz  
       2020-04-02 15:42:25 +08:00
    艹 怎写成 try-cache 了😂
    ljy1398202806
        8
    ljy1398202806  
       2020-04-02 16:15:30 +08:00
    @Fitz 谢谢大佬
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3097 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:50 · PVG 21:50 · LAX 05:50 · JFK 08:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.