Golang實現正方教務系統爬蟲(二)

上次我們已經登錄進了首頁,明白了爬蟲的原理,這次我們看一下web界面是如何實現的.

項目地址 https://github.com/Nickqiaoo/go-webcrawler

程序目前的功能很簡單一共四個函數.Welcone處理登錄請求,Querycredit處理學分查詢,Querygrade處理成績查詢.

func main() {
    http.HandleFunc("/credit", controller.Querycredit)
    http.HandleFunc("/login/", controller.Welcome)
    http.HandleFunc("/static/", controller.Welcome)
    http.HandleFunc("/grade", controller.Querygrade)
    err := http.ListenAndServe(":9090", nil)
    if err != (nil) {
        log.Fatal("ListenAndServe:", err)
    }
}

login

Welcome函數中判斷請求方式,GET請求則返回login界面,POST請求處理登錄返回welcome界面.

welcome
welcome界面做了一些處理,第一爲了兩個按鈕提交到不同的處理函數,這裏提交是用js實現的,第二這裏用了兩個hidden標籤記錄姓名和學號,直接POST給查詢函數,因爲後面查詢的URL需要用這兩個參數進行拼接,這樣服務端無需對用戶信息作保存.

這裏重點說一下cookie策略

對每一個用戶,我們要保證他每次提交到教務系統的cookie都一樣,我一開始的思路是向獲取教務系統的cookie,再生成用戶cookie將兩個cookie關聯,後來發現其實可以直接將教務系統的cookie直接給用戶作爲用戶cookie,這樣服務端什麼都不用存.

req, err := c.Get(Url2)
cook := c.Jar.Cookies(u)
cookie := http.Cookie{Name: cook[0].Name, Value: cook[0].Value, Path: "/", MaxAge: 800}
http.SetCookie(w, &cookie)

之後的查詢就和之前一樣了,拼接查詢的url地址,POST請求.這裏我們如何從返回的html裏提取我們需要的信息呢?一種思路是正則,我覺得太麻煩.這裏我們用一個goquery

doc := decoder.NewReader(response.Body)
result, _ := goquery.NewDocumentFromReader(doc)
view, _ := result.Find("#__VIEWSTATE").Attr("value")
event, _ := result.Find("#__EVENTVALIDATION").Attr("value")

直接獲取DOM節點的值,很方便.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章