乐趣区

关于go:Go语言学习笔记Http请求Gorequest使用

最近几天部署代理池的时候,用 Python 写了 requests 申请测试 IP 地址检测连通性的脚本。然而发现了一个问题,requests.get 带代理申请有时候申请不通。
我初步认为代理的问题,然而之后我用了 curl 申请发现代理是失常的,用 Go 写了测试发现还是失常的。难道是 requests 的问题?目前不晓得是什么起因,之后我用 Go 写了代理的测试,由此我发现了一个 Go 语言比拟好用的 Http 申请的包——Gorequest。

Go 语言中 net/http 的代理申请
net/http 申请整体流程并不简单,用 nrt/http 包的 get,post 办法都能够实现。
然而,在配置代理上,须要独自配置 Client 客户端:

1.// 发送申请  
2.rqt, err := http.NewRequest("GET", testApi, nil)  
3.if err != nil {4.    fmt.Println(err)  
5.    return  
6.}  
7.// 配置代理  
8.client := &http.Client{  
9.    Transport: &http.Transport{10.        Proxy: http.ProxyURL(urlProxy),  
11.    },  
12.}  
13.response, err := client.Do(rqt)  
14.if err != nil {15.    fmt.Println(err)  
16.    panic(err)  
17.    return  
18.}  

直到我发现了 Gorequest

Gorequest
$ go get github.com/parnurzeal/gorequest // 装置
get 申请:

1.request := gorequest.New()  
2.resp, body, errs := request.Get(url).End()  

gorequest 代理,非常简单

1.request := gorequest.New().Proxy("代理")  

Gorequest 获取代理并进行测试
获取代理办法
定义一个 getRes 函数,接管 url,进行 http 申请并返回申请内容

1.func getRes(url string) string{2.    defer func() {3.        err := recover()  
4.        if err != nil {5.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
6.        }  
7.    }()  
8.    // 获取代理  
9.    _, body, errs := gorequest.New().Get(url).End()  
10.    if errs != nil {11.        panic(errs)  
12.    }  
13.    return body  
14.}  

定义一个 getIp 办法,获取代理并解决返回的 json(首先定义一个构造体以便解决 json)

1.type reqinfo struct {  
2.    Code int // 返回后果代码  
3.    Success bool //success 参数是否申请胜利  
4.    Msg,RequestIp string // 返回信息和本地申请的 IP 地址  
5.    Data []map[string]interface{} // 返回的 IP,类型是以 key 为字符串,值为空接口的 map 组成的 array   
6.}  
1.func getiP(getipUrl string){2.    defer func() {3.        err := recover()  
4.        if err != nil {5.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
6.        }  
7.    }()  
8.    body :=getRes(getipUrl)  
9.    fmt.Println(body)  
10.    // 解决 json  
11.    var info reqinfo  
12.    err := json.Unmarshal([]byte(body),&info)  
13.    if err != nil {14.        fmt.Println("json error",err)  
15.    }  
16.}  

for 循环并用 goroutine 多线程检测 IP

1.for _,v := range info.Data{2.    IP := v["ip"]  
3.    port := v["port"]  
4.    proxyUrl := fmt.Sprint("http://",IP,":",port)  
5.    fmt.Println(proxyUrl)  
6.    url := "https://api.myip.la/en?json"  
7.    wg.Add(1)  
8.    go ipcheck(url,proxyUrl)  
9.}  
10.wg.Wait() 
1.func ipcheck(url string,proxy string){2.    request := gorequest.New().Proxy(proxy)  
3.    _, body, errs := request.Get(url).  
4.        Set("User-Agent", `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36`).  
5.        End()  
6.    if errs != nil {7.        fmt.Println(errs)  
8.    }  
9.    fmt.Println(body)  
10.    defer wg.Done()  
11.    defer func() {12.        err := recover()  
13.        if err != nil {14.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
15.        }  
16.    }()  
17.}  

测试后果

本次代理测试应用的是 ipidea 的代理,地区笼罩广,亲测测试通过率不低,新用户能够白嫖流量哦。
地址:http://www.ipidea.net/

残缺代码

1.package main  
2.   
3.import (  
4.    "encoding/json"  
5.    "fmt"  
6.    "github.com/parnurzeal/gorequest"  
7.    "sync"  
8.    "time"  
9.)  
10.   
11.var wg sync.WaitGroup  
12.   
13.type reqinfo struct {  
14.    Code int  
15.    Success bool  
16.    Msg,RequestIp string  
17.    Data []map[string]interface{}  
18.}  
19.   
20.//api  
21.func getRes(url string) string{22.    defer func() {23.        err := recover()  
24.        if err != nil {25.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
26.        }  
27.    }()  
28.    // 获取代理  
29.    _, body, errs := gorequest.New().Get(url).End()  
30.    if errs != nil {31.        panic(errs)  
32.    }  
33.    return body  
34.}  
35.   
36.func ipcheck(url string,proxy string){37.    request := gorequest.New().Proxy(proxy)  
38.    _, body, errs := request.Get(url).  
39.        Set("User-Agent", `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36`).  
40.        End()  
41.    if errs != nil {42.        fmt.Println(errs)  
43.        //panic(errs)  
44.    }  
45.    fmt.Println(body)  
46.    defer wg.Done()  
47.    defer func() {48.        err := recover()  
49.        if err != nil {50.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
51.        }  
52.    }()  
53.}  
54.   
55.func getiP(getipUrl string){56.    defer func() {57.        err := recover()  
58.        if err != nil {59.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
60.        }  
61.    }()  
62.    body :=getRes(getipUrl)  
63.    fmt.Println(body)  
64.    // 解决 json  
65.    var info reqinfo  
66.    err := json.Unmarshal([]byte(body),&info)  
67.    if err != nil {68.        fmt.Println("json error",err)  
69.    }  
70.    for _,v := range info.Data{71.        IP := v["ip"]  
72.        port := v["port"]  
73.        proxyUrl := fmt.Sprint("http://",IP,":",port)  
74.        fmt.Println(proxyUrl)  
75.        url := "https://api.myip.la/en?json"  
76.        wg.Add(1)  
77.        go ipcheck(url,proxyUrl)  
78.    }  
79.    wg.Wait()  
80.}  
81.   
82.func main() {  
83.    getipUrl := "代理链接"  
84.    getiP(getipUrl)  
85.}  
退出移动版