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