前言
我们在做一些自动化业务或者爬虫业务的时候常常要用到模拟请求,例如模拟登录,模拟购买,抓取页面内容等。如果抓取的页面是一个毫无权限校验的普通页面,那只用Get方法即可,但现实往往比较残酷,不是都那么轻易的被你采集。在一个有登录判断的页面,你可能要伪造cookie,header等;如果IP被限制了访问次数,你还需要使用到代理IP。
一个常规的请求如下图:
代码
方法代码:
package utils
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
//模拟请求方法
func HttpPost(postUrl string, headers map[string]string, jsonMap map[string]interface{}, proxyIP string) (string, string) {
client := &http.Client{}
//转换成postBody
bytesData, err := json.Marshal(jsonMap)
if err != nil {
fmt.Println(err.Error())
return "", ""
}
postBody := bytes.NewReader(bytesData)
//是否使用代理IP
if proxyIP != "" {
proxy := func(_ *http.Request) (*url.URL, error) {
return url.Parse(proxyIP)
}
transport := &http.Transport{Proxy: proxy}
client = &http.Client{Transport: transport}
} else {
client = &http.Client{}
}
//post请求
req, _ := http.NewRequest("POST", postUrl, postBody)
for k, v := range headers {
req.Header.Add(k, v)
}
resp, _ := client.Do(req)
//返回内容
body, _ := ioutil.ReadAll(resp.Body)
//解析返回的cookie
var cookieStr string
cookies := resp.Cookies()
if cookies != nil {
for _, c := range cookies {
cookieStr += c.Name + "=" + c.Value + ";"
}
}
return string(body), cookieStr
}
调用代码:
package main
import (
"encoding/json"
"fmt"
"goShare/utils"
)
func main() {
//模拟登录 获取cookie
loginMap := make(map[string]interface{})
loginMap["name"] = "yezi" //账号
loginMap["password"] = "123456" //密码
body, cookiesStr := utils.HttpPost("https://www.xxx.com/login", nil, loginMap, "")
//body jsonStr转map
var jmap map[string]interface{}
if err := json.Unmarshal([]byte(body), &jmap); err != nil {
fmt.Println("解析失败", err)
return
}
//判断登录是否成功
if jmap["code"] != "200" {
fmt.Println("登录失败", jmap["message"])
return
}
//代理IP 可以去网上找免费的或者收费的
proxyIP := "47.112.222.179:8000"
//组织headers
headers := make(map[string]string)
headers["cookie"] = cookiesStr
//抓取页面
body2, _ := utils.HttpPost("https://www.xxx.com/detail/1", headers, nil, proxyIP)
if err := json.Unmarshal([]byte(body), &jmap); err != nil {
fmt.Println("解析失败", err)
return
}
fmt.Println("采集完毕,返回结果:", body2)
}
总结
本文只是讲了一种模拟请求的场景,关于不同的业务可以灵活变通一下。
有疑问加站长微信联系(非本文作者)