2

前言

我们在做一些自动化业务或者爬虫业务的时候常常要用到模拟请求,例如模拟登录,模拟购买,抓取页面内容等。如果抓取的页面是一个毫无权限校验的普通页面,那只用Get方法即可,但现实往往比较残酷,不是都那么轻易的被你采集。在一个有登录判断的页面,你可能要伪造cookie,header等;如果IP被限制了访问次数,你还需要使用到代理IP。

一个常规的请求如下图:
ca4aecc42d16e8713ab1cb84f941159.png

代码

方法代码:

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)  
}

总结

本文只是讲了一种模拟请求的场景,关于不同的业务可以灵活变通一下。如果本文对你有所帮助,请点个赞。


叶子
79 声望14 粉丝