Golang实现正方教务系统爬虫

大二上学期的时候用python实现过一个简单的爬虫,学了go以后发现go的标准库十分强大,于是想实现一个教务系统的爬虫,爬取学分和成绩页面,再搞一个web界面出来.
项目github地址:https://github.com/Nickqiaoo/go-webcrawler

爬取分析

爬虫无非就是模拟浏览器的HTTP请求,我们首先来看一下浏览器是怎么发请求的.

这里写图片描述

这是教务系统的主页,要想登录首先要获取验证码.验证码是怎么获取的呢?

这里写图片描述

可以看到是GET CheckCode这个URL获取的验证码,注意cookie,当我们第一次请求的时候服务器会给我们一个cookie,以后每次请求都要带着这个cookie,用net/http包下的 NewRequst函数构造一个GET请求,然后建一个Client来Do就可以实现.注意必须要对Client的Jar初始化
具体如何使用看标准库的中文文档标准库中文版

jar, _ := cookiejar.New(nil)
u, _ := url.Parse(Url2)
c := http.Client{
    Jar: jar,
}
file1, err := os.OpenFile("./static/image.jpg",os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.ModePerm)
if err != nil {
    log.Fatal(err)
}
defer file1.Close()

req, err := c.Get(Url2)
cook := c.Jar.Cookies(u)
fmt.Println(cook[0].Name, cook[0].Value)
cookie := http.Cookie{Name: cook[0].Name, Value: cook[0].Value, Path: "/", MaxAge: 800}
http.SetCookie(w, &cookie)
image, _ := ioutil.ReadAll(req.Body)
file1.Write(image)
//var imagecode string
fmt.Println("请输入验证码")

这里的Url2就是验证码的url,新建一个GET请求获取验证码保存到image.jpg中.注意:cookie那几行代码先不用管,那是为了实现web界面的,只要我们以后的请求都用一开始初始化的Cilent来Do就可以了.

接下来我们看如何登录
这里写图片描述

可以看到就是POST一个请求,注意这些Request Headers,请求时只要加上Content-Type,Referer,User-Agent就行了.看看具体POST了什么内容
这里写图片描述
txtUserName,TextBox2,txtSecretCode分别是学号,密码,验证码,RadioButtonList1其实是”学生”的GBK编码,我们需要将GBK和UTF8互转.这里我用到了这个库mahonia.POST的数据还有这两个东西__VIEWSTATE,__EVENTVALIDATION,这是.net特有的,每一个页面这两个值都不一样,通过看登录页的html代码可以找到这两个值.有了这些内容我们就可以的登录了.

url1 := "http://xk1.ahu.cn/default2.aspx"
v := url.Values{}
encoder := mahonia.NewEncoder("gbk")
decoder := mahonia.NewDecoder("gbk")
but := encoder.ConvertString("学生")
v.Add("__VIEWSTATE", "/wEPDwUJODk4OTczODQxZGQhFC7x2TzAGZQfpidAZYYjo/LeoQ==")
v.Add("txtUserName", username)
v.Add("TextBox2", password)
v.Add("txtSecretCode", imagecode)
v.Add("RadioButtonList1", but)
v.Add("Button1", "")
v.Add("lbLanguage", "")
v.Add("hidPdrs", "")
v.Add("hidsc", "")
v.Add("__EVENTVALIDATION", "/wEWDgKX/4yyDQKl1bKzCQLs0fbZDAKEs66uBwK/wuqQDgKAqenNDQLN7c0VAuaMg+INAveMotMNAoznisYGArursYYIAt+RzN8IApObsvIHArWNqOoPqeRyuQR+OEZezxvi70FKdYMjxzk=")
//建立client发送POST请求
body := strings.NewReader(v.Encode())
r, _ := http.NewRequest("POST", url1, body)
r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
r.Header.Add("Referer", "http://xk1.ahu.cn/default2.aspx")
r.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36")
response, err := c.Do(r)
fmt.Println("主页",response.Status)
checkErr(err)

这时response.Body的内容就是我们爬取到的主页的html代码了.


下一节再写怎么爬取成绩和学分页面,其实都是一样的.

原文地址:https://www.cnblogs.com/nickqiao/p/7583328.html