const (
login_url string="你的网页"//登陆页
post_url string="你的URL"//跳转页(隐藏路由)
main_url string="你的URL"//进入学生专区页
score_url string="你的URL"//成绩页面
creit_url string="你的URL"
)
func Login(id string,password string,kksj string,xsfs string) (interface{} interface{},interface{},interface{}){
course_url := "http://jwcxxcx.ccsu.cn/jwxt/tkglAction.do?method=goListKbByXs&sql=&xnxqh="+kksj+"&zc=&xs0101id="+id
c:=&http.Client{}
req,_:=http.NewRequest("POST",login_url,nil)
res_post,_:=c.Do(req)
var temp_cookies=res_post.Cookies()
for _,v:=range res_post.Cookies(){
req.AddCookie(v)
}
//提交用户数据
postUsers :=url.Values{}
postUsers.Add("USERNAME",id)
postUsers.Add("PASSWORD",password)
postURL,_:=url.Parse(post_url)
Jar,_:=cookiejar.New(nil)
Jar.SetCookies(postURL,temp_cookies)
c.Jar=Jar
res_post,_=c.PostForm(post_url,postUsers) //提交用户名密码数据
res_main,_:=c.PostForm(main_url,postUsers)//进入学生专区页面数据提交
res_course,_:=c.PostForm(course_url,postUsers)//返回一个response请求
//查询时需要post数据 不能仅仅只靠cookie
postDate :=url.Values{}
postDate.Add("kksj",kksj)//开课时间
postDate.Add("xsfs",xsfs)//显示方式
sorceURL,_:=url.Parse(score_url)
Jar.SetCookies(sorceURL,temp_cookies)
res_score,_:=c.PostForm(score_url,postDate)//进入成绩查询页面
res_credit,_:=c.PostForm(creit_url,postUsers)//学分绩和成绩是一个页面 ,但是需要单独post 这里我没有返回这个数据 有兴趣可以加参数返回接收
//接收上面post后的response请求 成绩页面
//接受上面post后的response请求 课表页面
data_score,errScore:=score(res_score)
data_course,errCourse:=course(res_course)
res_post.Body.Close()
res_main.Body.Close()
res_credit.Body.Close()
return data_course,data_score,errCourse,errScore
}
func (this *MainController) CrawlCourse(){
date:="2016-2017-1"
var id="B20160302111"//学号
var pwd="062532" //密码
var Sorce_Way="zhcj" //"qbcj" //显示全部还是最好成绩
data_course,_,errCourse,_:=Login(id, pwd, date,Sorce_Way)
result := make(map[string]interface{})
if(errCourse==0) {
result["status"] =10002
result["message"]="未查询到相关信息"
}else {
result["status"] =10000
result["message"]="success"
result["Data"]=data_course
}
this.Data["json"]=result
this.ServeJSON()
return
}
func score(res_score *http.Response) (interface{},interface{}){
type Course_Cloum struct {
Num string //课程Id
Student_Id string //学号
Name string //姓名
Date string //学期
Course_Name string //课程名称
Score string //成绩
Flag string //成绩标志
Course_Habitude string //课程性质
Course_Kind string //课程类别
Study_Time string //学时
Credit string //学分
Exam_Habitude string //考试性质
}
//每一门课对应的一行
type Course struct {
Record[] Course_Cloum
}
var course_cloum Course_Cloum
var course Course
//这个通过goquery接收res_score请求
doc_score,_:=goquery.NewDocumentFromResponse(res_score)
doc_score.Find(".smartTr").Each(func(j int,contentSelection *goquery.Selection){
//获取每个tr中的所有td
contentSelection.Find("td").Each(func(i int, contentSelection *goquery.Selection) {
data:= contentSelection.Text()// 获取表格中每一个td
switch (i) {
case 1:
course_cloum.Num = data//课程Id
case 2:
course_cloum.Student_Id = data//学号
case 3:
course_cloum.Name = data//姓名
case 4:
course_cloum.Date = data//学期
case 5:
course_cloum.Course_Name = data//课程名称
case 6:
course_cloum.Score = data//成绩
case 7:
course_cloum.Flag = data//成绩标志
case 8:
course_cloum.Course_Habitude = data//课程性质
case 9:
course_cloum.Course_Kind = data//课程类别
case 10:
course_cloum.Study_Time = data//学时
case 11:
course_cloum.Credit = data//学分
case 12:
course_cloum.Exam_Habitude = data//考试性质
}
})
//切片的拼接
course.Record=append(course.Record, course_cloum)
})
var errScore int
data_score:=course.Record
if data_score==nil{
errScore=0
}else {
errScore=1
}
return data_score,errScore
}
我用的是beego自带注解路由 之前是直接自己用源码写的路由请求的 用http请求直接写
借鉴了nladuo的源码 http://studygolang.com/topics/1195
以及 社区里面的文章 用goquery 抓取社区主题贴 ( 作者没有找到 )
处理错误方面没有自己去做了 学校教务系统平时外网访问不了
代码贴出来做个参考
感觉这个教务系统还是比较简单爬进去 求助大神 关于模拟登陆重定向的的问题怎么弄 再go里面没有相应的函数处理该问题 学校另一个网站 做了重定向处理 生成一个口令 然后再跳转 每次模拟登陆数据总是post不进![2WOKITKN{}]KQPZP6{V~]LR.png](http://studygolang.qiniudn.com/170115/6d3c6820ddab025a844c0ac46a4a64e1.png)![4LM{8{KY}]~%H3DU`7{GYYW.png](http://studygolang.qiniudn.com/170115/f232ce7c6a97995a3ba6a42ae1d4530f.png)![6X7E8X2)2($4K(A82NLVHLM.png](http://studygolang.qiniudn.com/170115/1e2c9690625a75ec5b99f25e64300ce4.png)![S2T60HZ~$FW4E]ML7)EZ4~S_副本.png](http://studygolang.qiniudn.com/170115/20c31db87eff8fd31f752e0ef0190998.png)
有疑问加站长微信联系(非本文作者)