go語言中怎么使用HTTP代理。
以下代碼主要圍繞第一次接觸HTTP代理IP的go新手來寫(步驟注釋清晰)。
直接把下面示例代碼中的HTTP代理API,替換成你后臺(tái)生成的代理API鏈接,就可以跑起來了。
以下是一個(gè)示例代碼,只是一個(gè)基礎(chǔ)的演示,具體的代碼還是要根據(jù)你業(yè)務(wù)的實(shí)際情況去寫的。
示例代碼中的HTTP代理IP,我使用的是華益云的HTTP代理API,注冊(cè)就能白嫖1萬個(gè)高匿爬蟲IP,有效期是一年,對(duì)于調(diào)試代碼來說這個(gè)時(shí)間是非常的友好。
示例代碼demo中同款HTTP代理API-點(diǎn)我免費(fèi)領(lǐng)取10000個(gè)高匿IP
打開代理API,獲取里面的IP,使用IP訪問目標(biāo)網(wǎng)站,其實(shí)代碼中就是執(zhí)行這個(gè)過程而已,然后加了幾個(gè)錯(cuò)誤判斷有助于代碼的穩(wěn)定運(yùn)行。(步驟注釋清晰)
package main
import (
"errors"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
"time"
)
func main() {
// 發(fā)送給服務(wù)器的標(biāo)識(shí)
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,注冊(cè)就送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
}
// 目標(biāo)請(qǐng)求網(wǎng)站
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 {
// 這里說明請(qǐng)求成功了,直接可以退出循環(huán)了
fmt.Println(out)
break
} else {
if len(outPutProxy) == 0 {
// 沒有代理了再次獲取下
outPutProxy, err = getProxy(proxyUrl, userAgent)
if err != nil {
log.Fatalln(err)
}
}
}
}
// 最終的響應(yīng)內(nèi)容
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!用戶名或密碼錯(cuò)誤","success":false}
if strings.Index(proxyIps, "{") > -1 {
return outPutProxy, errors.New(proxyIps)
}
outPutProxy = strings.Split(proxyIps, "\r\n")
fmt.Printf("總共獲取了%d個(gè)代理\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秒最大超時(shí)
Transport: &http.Transport{Proxy: http.ProxyURL(proxy)},
}
} else {
client = http.Client{
Timeout: 5 * time.Second, // 5秒最大超時(shí)
}
}
// 創(chuàng)建新的Request對(duì)象
req, err := http.NewRequest("GET", reqUrl, nil)
if err != nil {
return "", err
}
// 設(shè)置請(qǐng)求頭
req.Header.Set("user-agent", userAgent)
// 向服務(wù)器發(fā)送請(qǐng)求
resp, err := client.Do(req)
if err != nil {
return "", err
}
// 讀取響應(yīng)內(nèi)容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
// 將響應(yīng)內(nèi)容轉(zhuǎn)為string類型
response := string(body)
return response, nil
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
HTTP
+關(guān)注
關(guān)注
0文章
537瀏覽量
35345 -
代碼
+關(guān)注
關(guān)注
30文章
4967瀏覽量
73954 -
go語言
+關(guān)注
關(guān)注
1文章
159瀏覽量
9778
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
Go語言常量的聲明
在 Go 語言中, 常量 表示的是固定的值,常量表達(dá)式的值在編譯期進(jìn)行計(jì)算,常量的值不可以修改。例如:3 、 Let's go 、 3.14 等等。常量中的數(shù)據(jù)類型只可以是 布爾型 、 數(shù)字型 (整數(shù)型、浮點(diǎn)型和復(fù)數(shù))
發(fā)表于 07-20 15:24
?819次閱讀
go語言枚舉類型怎么用
go 語言枚舉類型是這么用的?在什么場(chǎng)景下會(huì)用到枚舉?本文對(duì) go 語言枚舉做了詳細(xì)講解。 枚舉,是一種重要的數(shù)據(jù)類型,由一組鍵值對(duì)組成,通常用來在編程
詳細(xì)介紹go語言中的閉包的實(shí)現(xiàn)
什么是閉包? 什么場(chǎng)景下會(huì)用閉包 ? 本文對(duì) go 語言中的閉包做了詳細(xì)介紹。 閉包是由函數(shù)及其相關(guān)引用環(huán)境組合而成的實(shí)體(即:閉包=函數(shù)+引用環(huán)境)。 Go中的閉包 閉包是函數(shù)式語言中
帶你了解go語言中的閉包
? 【 導(dǎo)讀】什么是閉包? 什么場(chǎng)景下會(huì)用閉包 ? 本文對(duì) go 語言中的閉包做了詳細(xì)介紹。 閉包是由函數(shù)及其相關(guān)引用環(huán)境組合而成的實(shí)體(即:閉包=函數(shù)+引用環(huán)境)。 Go中的閉包 閉包是函數(shù)式
Go語言中的包
每個(gè) Go 文件都屬于且僅屬于一個(gè)包,一個(gè)包可以由許多以 .go 為擴(kuò)展名的源文件組成,因此文件名和包名一般來說都是不相同的。
go語言中怎么使用HTTP代理
評(píng)論