Blogger Information
Blog 9
fans 0
comment 0
visits 6972
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Go语言学习笔记:Http请求--Gorequest使用
IPIDEA全球HTTP
Original
602 people have browsed it


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

 


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post