暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python爬虫自动查询教务处课程成绩

AISeer 2021-09-23
1087

读完需要

5
分钟

速读需 3 分钟

在大学时期参与校创项目基于Java自动查询教务处成绩APP设计,对于其中的教务处成绩爬取模块一知半解。因此,在学习python之后重新实现此过程。此处以兰州大学研究生综合管理系统为例。
此程序的目标:根据学生输入的学号和密码,自动查询学生教务处成绩。
该流程涉及的工具如下:
  1. Python 2.7

  2. Chrome

  3. Wireshark

  4. Tesseract-ocr + Pytesseract

关键步骤首先在于下载登录界面上的验证码,然后在本地识别并输入验证码进行登录。其次要考虑到的是登录提交表单的内容。
问题是利用chrome浏览器自带的开发者工具不能记录对登录页面提交的表单。后来采用以前接触过的wireshark抓包工具来抓取登录页面提交的表单信息。

1. 首先利用chrome浏览器查看登录页面的验证码地址的对应的请求地址。

2. 然后查看登录时请求的地址(注意不是登录页面的地址,如果错误会发生异常)。

3. 对于网页中的验证码,先下载到本地然后再展示出来供用户手动输入。

以下给出其简单的代码示例:
    # -*- coding:utf-8 -*-
    '''
    Created on 2017年10月30日


    @summary: 利用Python爬虫爬取研究生教务系统信息


    @author: dreamhome
    '''
    import urllib
    import urllib2
    import cookielib
    import re
    import json


    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg # mpimg 用于读取图片


    from bs4 import BeautifulSoup


    loginUrl = "http://gms.lzu.edu.cn/graduate/j_acegi_security_check"


    #cookie
    cookie = cookielib.CookieJar()
    handler = urllib2.HTTPCookieProcessor(cookie)
    opener = urllib2.build_opener(handler)
    #postdata
    values = {
    'j_username':'',
    'j_password':'',
    'j_captcha':''
    }
    #headers
    header = {
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',
    'Referer':'http://gms.lzu.edu.cn/graduate/j_acegi_security_check'
    }


    #输入学号
    print "请输入学号:"
    values['j_username']=raw_input()
    #输入密码
    print "请输入密码:"
    values['j_password']=raw_input()


    #获取验证码


    validate_number=opener.open("http://gms.lzu.edu.cn/graduate/getCaptcha.do?")
    validate_number_data=validate_number.read()
    validate_number_pic=file("validate.jpg",'wb')
    validate_number_pic.write(validate_number_data)
    validate_number_pic.close()


    #显示验证码


    validate = mpimg.imread('validate.jpg')
    plt.imshow(validate)
    plt.axis('off') # 不显示坐标轴
    plt.show()


    #输入验证码
    print '请输入验证码:'
    values['j_captcha']=raw_input()


    #模拟登陆
    postdata = urllib.urlencode(values)
    request = urllib2.Request(loginUrl,postdata,header)
    response = opener.open(request)
    score_url = 'http://gms.lzu.edu.cn/graduate/studentscore/queryScore.do?groupId=&moduleId=25011'
    response = opener.open(score_url)
    html=response.read()




    #判断登录是否成功
    if "权限不够,访问被拒绝" in html:
    print "登录信息错误,请重新登录"
    exit()


    #简单数据解析
    soup = BeautifulSoup(html.decode('utf8'),'lxml')
    trs = soup.findAll('tr')
    score_data=[]
    for tr in trs:
    row=tr.get_text().split()
    temp_row=[]
    for x in row:
    temp_row.append(x.strip())
    score_data.append(temp_row)


    #输出成绩信息
    for x in range(len(score_data)):
    for y in score_data[x]:
    print y,
    print



    如果存在输入错误的情况,代码中没有提供循环登录,可以再执行一次程序。对于抓取的网页没有做过多的处理,直接提取了关键信息进行输出。如果需要拓展,可以使用beautifulsoup库进行详细解析。
    本程序执行结果如下图所示:

    拓展


    上述流程中包含用户手动输入验证码操作,并不是完全的自动化查询。因此可以加入自动识别验证码的模块。
    Tesseract-ocr是一个强大的文字识别工具,Tesseract ocr+Pytesseract可以实现验证码的自动识别。在ubuntu中安装方法如下所示(windows用户可自行搜索安装):
      1.tesseract-ocr安装
      sudo apt-get install tesseract-ocr


      2.pytesseract安装
      sudo pip install pytesseract
      该模块的接口调用代码如下:
        from PIL import Image
        import pytesseract


        # 自动识别验证码
        image=Image.open('validate.jpg')
        code= pytesseract.image_to_string(image)
        print code
        上述流程中简单的介绍了教务系统中成绩获取的方式,对于学生其它信息的获取可以进行拓展。如存在问题可以反馈哦



        dreamhomes


        博客:梦家の博客

        隐形字

        公众号:DreamHub


        长按识别二维码关注




        分享给大家一起看哟~
        文章转载自AISeer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论