Go 爬虫代理开发示例
代码示例说明
- 代码样例不能直接运行,请替换成您自己的代理信息。
- 在不同编程语言的代码示例中,需注意其环境版本。
- 示例代码使用遇到问题请,我们会为您提供技术支持。
net/http
1package main23import (4"net/url"5"net/http"6"bytes"7"fmt"8"io/ioutil"9)1011// 代理服务器(产品官网 www.16yun.cn)12const ProxyServer = "t.16yun.cn:31111"1314type ProxyAuth struct {15Username string16Password string17}1819func (p ProxyAuth) ProxyClient() http.Client {2021var proxyURL *url.URL22if p.Username != ""&& p.Password!="" {23proxyURL, _ = url.Parse("http://" + p.Username + ":" + p.Password + "@" + ProxyServer)24}else{25proxyURL, _ = url.Parse("http://" + ProxyServer)26}27return http.Client{Transport: &http.Transport{Proxy:http.ProxyURL(proxyURL)}}28}2930func main() {313233targetURI := "https://httpbin.org/ip"343536// 初始化 proxy http client37client := ProxyAuth{"username", "password"}.ProxyClient()3839request, _ := http.NewRequest("GET", targetURI, bytes.NewBuffer([] byte(``)))4041// 设置Proxy-Tunnel42// rand.Seed(time.Now().UnixNano())43// tunnel := rand.Intn(10000)44// request.Header.Set("Proxy-Tunnel", strconv.Itoa(tunnel) )4546response, err := client.Do(request)4748if err != nil {49panic("failed to connect: " + err.Error())50} else {51bodyByte, err := ioutil.ReadAll(response.Body)52if err != nil {53fmt.Println("读取 Body 时出错", err)54return55}56response.Body.Close()5758body := string(bodyByte)5960fmt.Println("Response Status:", response.Status)61fmt.Println("Response Header:", response.Header)62fmt.Println("Response Body:\n", body)63}64}
net/http(支持Proxy-Tunnel)
1package main23import (4"crypto/tls"5"fmt"6"io/ioutil"7"net"8"net/http"9"net/http/httputil"10"net/url"11"time"12)1314func main() {1516for {17// 代理服务器的用户名和密码18proxyUsername := "username"19proxyPassword := "password"20// 代理服务器(产品官网 www.16yun.cn)21// 代理服务器的 URL22proxyURL, err := url.Parse(fmt.Sprintf("http://%s:%s@t.16yun.cn:31111", proxyUsername, proxyPassword))23if err != nil {24fmt.Println(err)25return26}27// 添加自定义头部,28//rand.Seed(time.Now().UnixNano())29//tunnel := rand.Intn(10000)30//proxyHeaders.Add("Proxy-Tunnel", strconv.Itoa(tunnel))3132proxyHeaders := http.Header{}33// 设置为固定的数字 ,后面所有请求都会固定到一个IP上34// proxyHeaders.Add("Proxy-Tunnel", "1")3536// 定制Transport37tr := &http.Transport{38Proxy: http.ProxyURL(proxyURL),39TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 如果需要跳过证书验证40// 自定义DialContext函数41DialContext: (&net.Dialer{42Timeout: 30 * time.Second,43KeepAlive: 30 * time.Second,44DualStack: true,45}).DialContext,46ProxyConnectHeader: proxyHeaders,47}48// 定制Client49client := &http.Client{5051Transport: tr,52}5354// 发起请求55req, err := http.NewRequest("GET", "https://httpbin.org/ip", nil)56if err != nil {57fmt.Println(err)58return59}6061// 使用httputil.DumpRequest输出完整的请求62dump, err := httputil.DumpRequestOut(req, true)63if err != nil {64fmt.Println(err)65return66}67fmt.Println(string(dump))6869// 发送请求70resp, err := client.Do(req)71if err != nil {72fmt.Println("error")73fmt.Println(err)74return75}76defer resp.Body.Close()77// 读取响应体78body, err := ioutil.ReadAll(resp.Body)79if err != nil {80fmt.Println(err)81return82}8384// 打印响应体85fmt.Println("Response Body:", string(body))86time.Sleep(time.Second * 1)87}8889}