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

3次阅读

共计 5328 个字符,预计需要花费 14 分钟才能阅读完成。

最近几天部署代理池的时候,用 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.}  
正文完
 0