Go语言学习笔记:Http请求--Gorequest使用

Go语言学习笔记:Http请求--Gorequest使用,第1张

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/989971.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存