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