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)代理

废话少扯,直接上代码

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "net/http"
  7. "net/url"
  8. )
  9. func main() {
  10. urli := url.URL{}
  11. urlproxy, _ := urli.Parse("https://127.0.0.1:9743")
  12. c := http.Client{
  13. Transport: &http.Transport{
  14. Proxy: http.ProxyURL(urlproxy),
  15. },
  16. }
  17. if resp, err := c.Get("https://www.google.com"); err != nil {
  18. log.Fatalln(err)
  19. } else {
  20. defer resp.Body.Close()
  21. body, _ := ioutil.ReadAll(resp.Body)
  22. fmt.Printf("%s\n", body)
  23. }
  24. }

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

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "net/http"
  7. "os"
  8. )
  9. func main() {
  10. // urli := url.URL{}
  11. // urlproxy, _ := urli.Parse("https://127.0.0.1:9743")
  12. os.Setenv("HTTP_PROXY", "http://127.0.0.1:9743")
  13. os.Setenv("HTTPS_PROXY", "https://127.0.0.1:9743")
  14. c := http.Client{
  15. // Transport: &http.Transport{
  16. // Proxy: http.ProxyURL(urlproxy),
  17. // },
  18. }
  19. if resp, err := c.Get("https://www.google.com"); err != nil {
  20. log.Fatalln(err)
  21. } else {
  22. defer resp.Body.Close()
  23. body, _ := ioutil.ReadAll(resp.Body)
  24. fmt.Printf("%s\n", body)
  25. }
  26. }

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

第二种方法: Socket5代理

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "net/http"
  7. "os"
  8. "golang.org/x/net/proxy"
  9. )
  10. func main() {
  11. // create a socks5 dialer
  12. dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:9742", nil, proxy.Direct)
  13. if err != nil {
  14. fmt.Fprintln(os.Stderr, "can't connect to the proxy:", err)
  15. os.Exit(1)
  16. }
  17. // setup a http client
  18. httpTransport := &http.Transport{}
  19. httpClient := &http.Client{Transport: httpTransport}
  20. // set our socks5 as the dialer
  21. httpTransport.Dial = dialer.Dial
  22. if resp, err := httpClient.Get("https://www.google.com"); err != nil {
  23. log.Fatalln(err)
  24. } else {
  25. defer resp.Body.Close()
  26. body, _ := ioutil.ReadAll(resp.Body)
  27. fmt.Printf("%s\n", body)
  28. }
  29. }

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

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. JS实战 · 复选框全选操作

    思路: 1.获取被选中checkbox,通过checked属性的状态完成: 2.获取被选中的checkbox的value值: 3.求所有value的和sum: 4.定义span区域存储和sum:   ...

  2. org.artofsolving.jodconverter.office.OfficeException: failed to start and connect

    org.artofsolving.jodconverter.office.OfficeException: failed to start and connect docviewer 调用 openo ...

  3. MySQL外键之级联

    简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...

  4. c#方法

    1.引用型参数: 关键字:ref 2.输出型参数 关键字:out 例: double area(out double p) { double t=3.14*10; p=2*t*3.14; return ...

  5. MongoDB 搭建副本集

    副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary ...

  6. ECMAScript6学习笔记 ——let、const、变量解构赋值

    let 不存在变量提升 通过let声明的变量仅在块级作用域内有效 不允许在同一个作用域内重复声明一个变量 防止值公用 var oUl = document.querySelectorAll('ul&g ...

  7. html5多出来的字自动隐藏并显示...

  8. Math的三个将小数值舍入为整数方法

    舍入规则: Math.ceil():执行向上舍入,即它总是将数值向上舍入为最接近的整数: Math.floor():执行向下舍入,即它总是将数值向下舍入为最接近的整数: Math.round():执行 ...

  9. Android之登录那点事

    随着互联网的高速发展,一个应用为了保护用户的隐私,通常会通过设置用户名+密码的验证方式保证用户隐私的相对安全,我知道一般网站的登录验证,通常会设置一个二维码,通过验证二维码,防止恶意软件通过机械程序, ...

  10. lintcode 最长上升连续子序列 II(二维最长上升连续序列)

    题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 I ...