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

xiaohaoxiong · 2017-01-15 10:53:59 · 3052 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-01-15 10:53:59 的主题,其中的信息可能已经有所发展或是发生改变。

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.png4LM{8{KY}]~%H3DU`7{GYYW.png6X7E8X2)2($4K(A82NLVHLM.pngS2T60HZ~$FW4E]ML7)EZ4~S_副本.png


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

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

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