共计 5328 个字符,预计需要花费 14 分钟才能阅读完成。
最近几天部署代理池的时候,用 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.}
正文完