Golang:Grequests 庫的使用
Go 語言版本的 request
Go 語言內(nèi)置的請求庫 net/http 非常的優(yōu)秀,但是在代碼封裝上卻不盡完美
對于我這種習(xí)慣于用 Python 寫爬蟲的人來說,如果能有像 Requests 的 Py 庫的 Go 版本實現(xiàn)那是再好不過了
所以 Grequests 就誕生了奴愉。
image
安裝
go get -u github.com/levigross/grequests
其次蚕键,在語法格式上也是遵循 Py 庫來封裝的妇智,直接來看它的用法
準備了一個模擬登錄的 demo
package main
import (
"encoding/json"
"fmt"
//go語言版本的jquery
//"github.com/PuerkitoBio/goquery"
//"os"
//"sync"
//"strings"
//go語言版本的request
"github.com/levigross/grequests"
)
func login_post(log_url, user string, session *grequests.Session) (resp *grequests.Response){
resp, err := session.Post(log_url,
&grequests.RequestOptions{
Data: map[string]string{
"mobile": user,
"password": "password",
},
Headers: map[string]string{
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8",
"Connection": "keep-alive",
"Content-Length":"69",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
},
})
if err == nil && resp.StatusCode == 200 {
fmt.Println("登錄成功!", resp)
return resp
}
fmt.Println("出錯")
return resp
}
func yuyue(yuyue_url string, goods_id int, session *grequests.Session) (resp *grequests.Response){
param := make(map[interface{}]interface{})
mapString := make(map[string]string)
param["i"] = 143
param["c"] = "entry"
param["do"] = "member"
param["m"] = "sz_yi"
param["p"] = "index"
param["op"] = "buy"
param["type"] = "bespeak"
param["id"] = goods_id
//fmt.Println(param)
for key, value := range param {
strKey := fmt.Sprintf("%v", key)
strValue := fmt.Sprintf("%v", value)
mapString[strKey] = strValue
}
fmt.Println(mapString)
resp, err := session.Get(yuyue_url,
&grequests.RequestOptions{
Headers: map[string]string{
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
},
Params:mapString,
//Params: map[string]string{
// "i": "143",
// "c": "entry",
// "do": "member",
// "m": "sz_yi",
// "p": "index",
// "op": "buy",
// "type": "bespeak",
// "id": goods_id,
//},
})
if err == nil && resp.StatusCode == 200 {
fmt.Println("預(yù)約成功两疚!", resp)
return resp
}
return resp
}
func main() {
var d map[string]interface{}
session := grequests.NewSession(nil) //建立session會話
//fmt.Printf("%T",session)
login_post("http://www.xxx.xxx/login","123456789100",session)
yuyue_result := yuyue("http://www.xxx.xxx/index.php",1,session)
//jjjj := []byte(yuyue_result.Bytes())
//fmt.Println(string(jjjj))
json.Unmarshal([]byte(yuyue_result.Bytes()), &d) //轉(zhuǎn)換成json格式
fmt.Println(d["result"])
}
其實我建議先把 文檔看一遍派歌,嘗試這寫兩遍弯囊,使用起來就比較順手了
首先要建立 Session 來保證登陸以及之后的操作來自同一個會話,并且作為參數(shù)傳入
headers 和 params參數(shù) 采用 map 傳入
可以看到 resp.StatusCode 之類的語法和 Py 的 requests 非常相似硝皂,實際上底層就是 requests
怎么說呢,Py 和 Go 都是開源語言作谭,如果你需要更改源碼讓代碼更強大稽物,可以大膽的去做
原生庫
那么,如果不使用 Grequests 的話該如何寫呢折欠?
簡單貼一下代碼
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
func login(log_url,user string) (*http.Client){
//params := url.Values{}
//params.Add("memberAccount", "xxx")
//params.Add("memberUmm", "haha")
//params.Add("check", captcha)
payload := url.Values{"mobile": {user}, "password": {"password"}}
//申明一個客戶端 或者 使用默認
client := &http.Client{}
req, err := http.NewRequest(
"POST",
log_url,
strings.NewReader(payload.Encode()), //strings.NewReader(params.Encode()))
)
if err != nil {
panic(err)
}
req.Header.Add("Accept", "application/json, text/javascript, */*; q=0.01")
req.Header.Add("Accept-Encoding", "gzip, deflate")
req.Header.Add("Connection", "keep-alive")
req.Header.Add("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36")
req.Header.Add("X-Requested-With", "XMLHttpRequest")
r, _ := client.Do(req)
defer func() { _ = req.Body.Close() }()
body, _ := ioutil.ReadAll(r.Body)
fmt.Printf("%s", body)
fmt.Printf("%T",req)
//cookie := r.Cookies()
//fmt.Println(cookie)
return client
}
func main() {
//get()
client := login("http://www.xxx.xxx/login","123456789100")
fmt.Printf("%T",client)
}
大概是這樣的贝或,原生庫有幾種寫法,具體的就不寫了
找個時間寫寫 go 的爬蟲并發(fā)
歡迎轉(zhuǎn)載锐秦,但要聲明出處咪奖,不然我順著網(wǎng)線過去就是一拳。
個人技術(shù)博客:http://www.gzky.live