最近几天部署代理池的时候,用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的代理,地区覆盖广,亲测测试通过率不低,新用户可以白嫖流量哦。
完整代码
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. }