最近几天部署代理池的时候,用Python写了requests请求测试IP地址检测连通性的脚本。但是发现了一个问题,requests.get带代理请求有时候请求不通。
我初步认为代理的问题,但是之后我用了curl请求发现代理是正常的,用Go写了测试发现还是正常的。难道是requests的问题?目前不知道是什么原因,之后我用Go写了代理的测试,由此我发现了一个Go语言比较好用的Http请求的包——Gorequest
Go语言中net/http的代理请求net/http请求整体流程并不复杂,用nrt/http包的get,post方法都可以实现。
但是,在配置代理上,需要单独配置Client客户端:
//发送请求
rqt, err := http.NewRequest("GET", testApi, nil)
if err != nil {
fmt.Println(err)
return
}
//配置代理
client := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(urlProxy),
},
}
response, err := client.Do(rqt)
if err != nil {
fmt.Println(err)
panic(err)
return
}
直到我发现了Gorequest
Gorequest$ go get github.com/parnurzeal/gorequest //安装
get请求:
request := gorequest.New()
resp, body, errs := request.Get(url).End()
gorequest代理,非常简单
request := gorequest.New().Proxy("代理")
Gorequest获取代理并进行测试
获取代理方法
定义一个getRes函数,接收url,进行http请求并返回请求内容
func getRes(url string) string{
defer func() {
err := recover()
if err != nil {
fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)
}
}()
//获取代理
_, body, errs := gorequest.New().Get(url).End()
if errs != nil {
panic(errs)
}
return body
}
定义一个getIp方法,获取代理并处理返回的json(首先定义一个结构体以便处理json)
type reqinfo struct {
Code int //返回结果代码
Success bool //success参数是否请求成功
Msg,RequestIp string //返回信息和本地请求的IP地址
Data []map[string]interface{} //返回的IP,类型是以key为字符串,值为空接口的map组成的array
}
func getiP(getipUrl string){
defer func() {
err := recover()
if err != nil {
fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)
}
}()
body :=getRes(getipUrl)
fmt.Println(body)
//处理json
var info reqinfo
err := json.Unmarshal([]byte(body),&info)
if err != nil {
fmt.Println("json error",err)
}
}
for循环并用goroutine多线程检测IP
for _,v := range info.Data{
IP := v["ip"]
port := v["port"]
proxyUrl := fmt.Sprint("http://",IP,":",port)
fmt.Println(proxyUrl)
url := "https://api.myip.la/en?json"
wg.Add(1)
go ipcheck(url,proxyUrl)
}
wg.Wait()
func ipcheck(url string,proxy string){
request := gorequest.New().Proxy(proxy)
_, body, errs := request.Get(url).
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`).
End()
if errs != nil {
fmt.Println(errs)
}
fmt.Println(body)
defer wg.Done()
defer func() {
err := recover()
if err != nil {
fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)
}
}()
}
测试结果
本次代理测试使用的是ipidea的代理,地区覆盖广,亲测测试通过率不低,新用户可以白嫖流量哦。
地址:http://www.ipidea.net/?utm-source=csdn&utm-keyword=?wb
完整代码package main
import (
"encoding/json"
"fmt"
"github.com/parnurzeal/gorequest"
"sync"
"time"
)
var wg sync.WaitGroup
type reqinfo struct {
Code int
Success bool
Msg,RequestIp string
Data []map[string]interface{}
}
//api
func getRes(url string) string{
defer func() {
err := recover()
if err != nil {
fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)
}
}()
//获取代理
_, body, errs := gorequest.New().Get(url).End()
if errs != nil {
panic(errs)
}
return body
}
func ipcheck(url string,proxy string){
request := gorequest.New().Proxy(proxy)
_, body, errs := request.Get(url).
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`).
End()
if errs != nil {
fmt.Println(errs)
//panic(errs)
}
fmt.Println(body)
defer wg.Done()
defer func() {
err := recover()
if err != nil {
fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)
}
}()
}
func getiP(getipUrl string){
defer func() {
err := recover()
if err != nil {
fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)
}
}()
body :=getRes(getipUrl)
fmt.Println(body)
//处理json
var info reqinfo
err := json.Unmarshal([]byte(body),&info)
if err != nil {
fmt.Println("json error",err)
}
for _,v := range info.Data{
IP := v["ip"]
port := v["port"]
proxyUrl := fmt.Sprint("http://",IP,":",port)
fmt.Println(proxyUrl)
url := "https://api.myip.la/en?json"
wg.Add(1)
go ipcheck(url,proxyUrl)
}
wg.Wait()
}
func main() {
getipUrl := "代理链接"
getiP(getipUrl)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)