Grequests 庫的使用

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酱床,一起剝皮案震驚了整個濱河市羊赵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖昧捷,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闲昭,死亡現(xiàn)場離奇詭異,居然都是意外死亡靡挥,警方通過查閱死者的電腦和手機序矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跋破,“玉大人簸淀,你說我怎么就攤上這事《痉担” “怎么了租幕?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饿悬。 經(jīng)常有香客問我令蛉,道長,這世上最難降的妖魔是什么狡恬? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任珠叔,我火速辦了婚禮,結(jié)果婚禮上弟劲,老公的妹妹穿的比我還像新娘祷安。我一直安慰自己,他們只是感情好兔乞,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布汇鞭。 她就那樣靜靜地躺著,像睡著了一般庸追。 火紅的嫁衣襯著肌膚如雪霍骄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天淡溯,我揣著相機與錄音读整,去河邊找鬼。 笑死咱娶,一個胖子當(dāng)著我的面吹牛米间,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膘侮,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼屈糊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琼了?” 一聲冷哼從身側(cè)響起逻锐,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谦去,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慷丽,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年鳄哭,在試婚紗的時候發(fā)現(xiàn)自己被綠了要糊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡妆丘,死狀恐怖锄俄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勺拣,我是刑警寧澤奶赠,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站药有,受9級特大地震影響毅戈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愤惰,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一苇经、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宦言,春花似錦扇单、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至响疚,卻和暖如春鄙信,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忿晕。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工装诡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杏糙。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓慎王,卻偏偏與公主長得像蚓土,于是被迫代替她去往敵國和親宏侍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 我承認有時候就是很沖動蜀漆,我不是不想后果谅河,我就是不愿意想,我怕我想著想著就沒有勇氣去做了。 我就感覺你根本不會有態(tài)度...
    拾不起的光閱讀 206評論 0 0
  • 項目Github地址: https://github.com/Henryhaohao/Wenshu_Spider ...
    Henryhaohao閱讀 1,571評論 0 1
  • 1994年12月31日绷耍,迎著初升的太陽我陳然來到了這個世界吐限,差一天就是普天同慶的元旦,差一天就可以領(lǐng)超市里...
    grey_pissenlit閱讀 163評論 0 0
  • 我懷念的 我經(jīng)歷著的 我期待的 希望都是我想要的 不是也沒關(guān)系 畢竟不是事事都能如人意的褂始,不是嗎 聽到一段很美麗的...
    海里西閱讀 162評論 0 0