zoukankan      html  css  js  c++  java
  • golang中如何使用http,socket5代理

    Golang Http use socket5 proxy

    因为最近想爬取一些网站上的视频,无奈网站在墙外,只能通过代理进行爬取,因此在网上搜索关于golang使用代理的方法。

    功夫不负有心人,最后我搜到了两张配置方法,趁着现在有空将它们总结一下。

    Http和Socket代理经常翻墙的梯子户经常用到,但是有些可能不怎么知道他们的区别。估计大家已经从它们的名字中看出了区别,http给人的第一感觉就是http协议嘛,也就是在浏览器中经常用到的,比如大家上网时输入的网址:http://www.google.com https://www.google.com等等,其实http代理主要的功能就是代理里客户机(用户计算机)进行http访问,代理浏览器进行网页的访问。而socket代理给人的第一印象则是socket套接字,没错socket代理在代理转发过程中,只是简单的传送数据包,不关心这些数据包是干嘛的是是属于什么协议什么应用的,正是因此socket代理的速度一般来说比http代理的速度快很多(因为人家不那么多事嘛,专心做好本职工作而已)。socket代理又分为socket4和sockt5代理,其中socket4只能支持TCP协议,而socket5则同时支持TCP协议和UDP协议。

    第一种方法: HTTP(S)代理

    废话少扯,直接上代码

    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    	"log"
    	"net/http"
    	"net/url"
    )
    
    func main() {
    	urli := url.URL{}
    	urlproxy, _ := urli.Parse("https://127.0.0.1:9743")
    	c := http.Client{
    		Transport: &http.Transport{
    			Proxy: http.ProxyURL(urlproxy),
    		},
    	}
    	if resp, err := c.Get("https://www.google.com"); err != nil {
    		log.Fatalln(err)
    	} else {
    		defer resp.Body.Close()
    		body, _ := ioutil.ReadAll(resp.Body)
    		fmt.Printf("%s
    ", body)
    	}
    }
    

    上面这种方法是通过在建立http.Client对象时指定代理地址,其实除了这么一种方式外,还有一种就是通过环境变量来指定代理。代码如下

    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    	"log"
    	"net/http"
    	"os"
    )
    
    func main() {
    	// urli := url.URL{}
    	// urlproxy, _ := urli.Parse("https://127.0.0.1:9743")
    	os.Setenv("HTTP_PROXY", "http://127.0.0.1:9743")
    	os.Setenv("HTTPS_PROXY", "https://127.0.0.1:9743")
    	c := http.Client{
    	// Transport: &http.Transport{
    	// 	Proxy: http.ProxyURL(urlproxy),
    	// },
    	}
    	if resp, err := c.Get("https://www.google.com"); err != nil {
    		log.Fatalln(err)
    	} else {
    		defer resp.Body.Close()
    		body, _ := ioutil.ReadAll(resp.Body)
    		fmt.Printf("%s
    ", body)
    	}
    }
    

    这个方法是通过设置环境变量,go会自动配置代理。

    第二种方法: Socket5代理

    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    	"log"
    	"net/http"
    	"os"
    
    	"golang.org/x/net/proxy"
    )
    
    func main() {
    	// create a socks5 dialer
    	dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:9742", nil, proxy.Direct)
    	if err != nil {
    		fmt.Fprintln(os.Stderr, "can't connect to the proxy:", err)
    		os.Exit(1)
    	}
    	// setup a http client
    	httpTransport := &http.Transport{}
    	httpClient := &http.Client{Transport: httpTransport}
    	// set our socks5 as the dialer
    	httpTransport.Dial = dialer.Dial
    	if resp, err := httpClient.Get("https://www.google.com"); err != nil {
    		log.Fatalln(err)
    	} else {
    		defer resp.Body.Close()
    		body, _ := ioutil.ReadAll(resp.Body)
    		fmt.Printf("%s
    ", body)
    	}
    }
    
    

    通过这两种方法可以实现轻松爬梯。

  • 相关阅读:
    底图与蒙版的过渡效果transition
    消除blur属性的边框
    jquery ajax实例教程和一些高级用法
    常用js正则表达式大全
    HTML5 + JS 调取摄像头拍照下载
    JS运动框架
    JS 实现AJAX封装(只限于异步)
    事件委托详解
    JS 实现随机验证码功能
    利用JS调取电脑摄像头,实现拍照功能
  • 原文地址:https://www.cnblogs.com/WingPig/p/5929138.html
Copyright © 2011-2022 走看看