golang 爬取教务系统的成绩 goquery的使用

xiaohaoxiong · · 2880 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

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)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2880 次点击  ∙  2 赞  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传