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\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)
}
}

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

golang中如何使用http,socket5代理的更多相关文章

  1. 基础知识 - Golang 中的正则表达式

    ------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...

  2. Golang中的RegExp正则表达式用法指南

    ------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...

  3. golang中的race检测

    golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...

  4. golang中的reflect包用法

    最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...

  5. webpack+vue-cil 中proxyTable配置接口地址代理

    webpack+vue-cil 中proxyTable配置接口地址代理 在项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包 ...

  6. Golang中的坑二

    Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...

  7. Golang 中的坑 一

    Golang 中的坑 短变量声明  Short variable declarations 考虑如下代码: package main import ( "errors" " ...

  8. google的grpc在golang中的使用

    GRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x. 前面写过一篇golang标准库的rpc包的用法,这篇文章接着讲一 ...

  9. Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper

    Golang中操作数据库已经有现成的库"database/sql"可以用,但是"database/sql"只提供了最基础的操作接口: 对数据库中一张表的增删改查 ...

随机推荐

  1. 《Spark大数据处理》—— 读后总结

    前几章 工作机制

  2. com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK assets/com.xx.xx

    完整的Error 信息(关键部分) Error:Execution failed for task ':fanwe_o2o_47_mgxz_dingzhi:transformResourcesWith ...

  3. VS2012 VS2015 的项目配置模板及其目录

    建立的项目多了的时候 , 就希望能自己配置好一个项目模板,以后建立的项目自动使用这个模板就省事了,不用每次都要改, 每个项目都要改了! 经不懈努力, 终于 发现了 vs2015,vs2012 (我只用 ...

  4. KnockoutJS 3.X API 第七章 其他技术(1) 加载和保存JSON数据

    Knockout允许您实现复杂的客户端交互性,但几乎所有Web应用程序还需要与服务器交换数据,或至少将本地存储的数据序列化. 最方便的交换或存储数据的方式是JSON格式 - 大多数Ajax应用程序今天 ...

  5. 【WP8.1开发】RenderTargetBitmap类的特殊用途

    相信,耍过WPF的人都知道RenderTargetBitmap这个玩意儿,这家伙比较有意思,它可以将用户界面上呈现的东西写入到内存的位图对象,从而开发者可以在应用程序中使用它,或者将其保存为图像文件. ...

  6. 斐讯Fir302b救砖教程

    首先本人是路由器小白,不算是硬件改装高手,昨天收到了微信活动中的斐讯Fir302b,大概当时得奖的有300人,所以最近肯定很大一批朋友手里有这样的一款路由. 上网查了一下,此款路由可以刷基于tomat ...

  7. 为什么DOM操作很慢

    转自:http://kb.cnblogs.com/page/534571/ 一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来 ...

  8. 从零开始编写自己的C#框架(2)——开发前准备工作

    没想到写了个前言就受到很多朋友的支持,大家的推荐就是我最大的动力(推荐得我热血沸腾,大家就用推荐来猛砸我吧O^-^O),谢谢大家支持. 其实框架开发大家都知道,不过要想写得通俗点,我个人觉得还是挺吃力 ...

  9. 窥探Swift之别具一格的Struct和Class

    说到结构体和类,还是那句话,只要是接触过编程的小伙伴们对这两者并不陌生.但在Swift中的Struct和Class也有着令人眼前一亮的特性.Struct的功能变得更为强大,Class变的更为灵活.St ...

  10. Java内存模型深度解析:锁--转

    原文地址:http://www.codeceo.com/article/java-memory-5.html 锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步 ...