golang中如何使用http,socket5代理

Golang Http use socket5 proxy

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

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

Http和Socket代理经常FQ的梯子户经常用到,但是有些可能不怎么知道他们的区别。估计大家已经从它们的名字中看出了区别,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\n", 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\n", 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\n", body)
	}
}

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

posted @ 2016-10-03 15:04  WingPig99  阅读(18649)  评论(3编辑  收藏  举报