go语言中怎么使用HTTP代理。
以下代码主要围绕第一次接触HTTP代理IP的go新手来写(步骤注释清晰)。
直接把下面示例代码中的HTTP代理API,替换成你后台生成的代理API链接,就可以跑起来了。
以下是一个示例代码,只是一个基础的演示,具体的代码还是要根据你业务的实际情况去写的。
示例代码中的HTTP代理IP,我使用的是华益云的HTTP代理API,注册就能白嫖1万个高匿爬虫IP,有效期是一年,对于调试代码来说这个时间是非常的友好。
示例代码demo中同款HTTP代理API-点我免费领取10000个高匿IP
打开代理API,获取里面的IP,使用IP访问目标网站,其实代码中就是执行这个过程而已,然后加了几个错误判断有助于代码的稳定运行。(步骤注释清晰)
package main
import (
"errors"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
"time"
)
func main() {
// 发送给服务器的标识
userAgent := "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/532.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
// 代理api(这里我推荐使用www.9vps.com华益云的HTTP代理API,注册就送1万IP)
proxyUrl := "http://http.9vps.com/getip.asp?username=166xxxx6597&pwd=xxxxbaa59ce237dff65134984b9cxxxx&geshi=1&fenge=1&fengefu=&Contenttype=1&getnum=20&setcity=&operate=all&"
outPutProxy, _ := getProxy(proxyUrl, userAgent)
if len(outPutProxy) == 0 {
// 没有获取到代理
return
}
// 目标请求网站
url := "https://www.qq.com/"
var out string = ""
for i := 0; i < 3; i++ {
// 最多尝试三次
px := outPutProxy[0]
outPutProxy = append(outPutProxy[:0], outPutProxy[1:]...)
fmt.Println("using proxy ", px)
response, err := requestGet(url, userAgent, "http://"+px)
out = fmt.Sprintf("%s", response)
if err == nil {
// 这里说明请求成功了,直接可以退出循环了
fmt.Println(out)
break
} else {
if len(outPutProxy) == 0 {
// 没有代理了再次获取下
outPutProxy, err = getProxy(proxyUrl, userAgent)
if err != nil {
log.Fatalln(err)
}
}
}
}
// 最终的响应内容
fmt.Println(out)
}
func getProxy(proxyUrl string, userAgent string) ([]string, error) {
var outPutProxy []string
proxyIps, err := requestGet(proxyUrl, userAgent, "")
fmt.Println(proxyIps)
if err != nil {
return outPutProxy, err
}
// {"code":3002,"data":[],"msg":"error!用户名或密码错误","success":false}
if strings.Index(proxyIps, "{") > -1 {
return outPutProxy, errors.New(proxyIps)
}
outPutProxy = strings.Split(proxyIps, "\r\n")
fmt.Printf("总共获取了%d个代理\n", len(outPutProxy))
return outPutProxy, nil
}
func requestGet(reqUrl string, userAgent string, proxyAddr string) (string, error) {
var client http.Client
if proxyAddr != "" {
// 有代理的情况
proxy, err := url.Parse(proxyAddr)
if err != nil {
return "", err
}
client = http.Client{
Timeout: 5 * time.Second, // 5秒最大超时
Transport: &http.Transport{Proxy: http.ProxyURL(proxy)},
}
} else {
client = http.Client{
Timeout: 5 * time.Second, // 5秒最大超时
}
}
// 创建新的Request对象
req, err := http.NewRequest("GET", reqUrl, nil)
if err != nil {
return "", err
}
// 设置请求头
req.Header.Set("user-agent", userAgent)
// 向服务器发送请求
resp, err := client.Do(req)
if err != nil {
return "", err
}
// 读取响应内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
// 将响应内容转为string类型
response := string(body)
return response, nil
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
HTTP
+关注
关注
0文章
504浏览量
31194 -
代码
+关注
关注
30文章
4779浏览量
68521 -
go语言
+关注
关注
1文章
158浏览量
9047
发布评论请先 登录
相关推荐
Go语言常量的声明
在 Go 语言中, 常量 表示的是固定的值,常量表达式的值在编译期进行计算,常量的值不可以修改。例如:3 、 Let's go 、 3.14 等等。常量中的数据类型只可以是 布尔型 、 数字型 (整数型、浮点型和复数)
发表于 07-20 15:24
•403次阅读
go语言枚举类型怎么用
go 语言枚举类型是这么用的?在什么场景下会用到枚举?本文对 go 语言枚举做了详细讲解。 枚举,是一种重要的数据类型,由一组键值对组成,通常用来在编程
详细介绍go语言中的闭包的实现
什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式语言中
带你了解go语言中的闭包
【 导读】什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式
评论