博客列表 >Go语言学习笔记:Http请求--Gorequest使用

Go语言学习笔记:Http请求--Gorequest使用

IPIDEA全球HTTP
IPIDEA全球HTTP原创
2022年10月11日 14:12:03604浏览


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

测试结果

 图片1.png

本次代理测试使用的是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. }

 


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议