zoukankan      html  css  js  c++  java
  • 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代码了.


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

  • 相关阅读:
    String类之indexOf--->查找某字对应的位置
    5、文件过滤器
    String类之endsWith方法--->检测该字符串以xx为结尾
    for循环
    java-成员方法/变量、类方法/变量等区别
    4、File类之获取方法
    3、File类之创建、删除、重命名、判断方法
    2、创建File类对象
    Java 实现Redis客户端,服务端
    Phoenix踩坑填坑记录
  • 原文地址:https://www.cnblogs.com/nickqiao/p/7583328.html
Copyright © 2011-2022 走看看