zoukankan      html  css  js  c++  java
  • 教务系统模拟登录与成绩爬取一

    版权声明:本文为博主原创文章,转载 请注明出处 https://blog.csdn.net/sc2079/article/details/82563854

    -写在前面


      暑假期间学校的学生教务系统大改,好多以前的微信公共号的爬虫都不能用了。想快速查成绩怎么办呢?哎,自己动手丰衣足食,不妨自己写个爬虫!
      上次写个中国大学MOOC课程信息爬取与数据存储博客,使用的是selenium+Chrome。而这次,不妨采用requests发送post、get请求获取数据。

    -环境配置安装


      运行环境:Python3.6、Spyder
      依赖的模块:bs4,requests.re,JSON,pymysql等

    -开始工作


    1. 模拟登录

      关于浏览器的选择,这里我推荐Firefox(可以看到post数据,并能模拟重发数据)。当然,如果你有fiddle等抓包工具的话,其他浏览器也OK。
      打开登录界面:

      输入账号密码,按F12打开开发者工具,再点击登录。

      此时在网页上可以看到自己的一些信息,比如自己的姓名,登录日期,学业信息等。此时我们观察开发者工具的网络窗口。

      其中,第一个就是我们的post登录请求,观察请求头(原始头)和请求参数。

      复制编辑请求头。

    headers2={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0',   
        'Cookie': 'JSESSIONID=bcdAIJyUvw0e24cRYH8ww;selectionBar=1443374',  
        }
    

      这里我去掉了一些对于请求无影响的字段。
      查看请求参数。

      复制编辑请求参数

    data={
          'j_captcha1':'error',
          'j_password':'××××××',
          'j_username':'×××××××××'
          }
    

      经测试,登录成功。

    url='http://×××××××××/j_spring_security_check'
    r=requests.post(url,headers=headers,data=data)
    

    2. 获取日期和用户名

      网页上的日期和用户名

      在开发者工具中找到这个信息。

      注意上面的请求网址变化了,且请求方法为Get。

      使用get请求获取网页信息再用bs4解析分别获得日期和用户名。

    '''获取登录日期和用户姓名'''
    url2='http://××××××/index.jsp'
    r2=requests.get(url2,headers=headers)  
    soup=BS(r2.content,'html.parser')  
    time=soup.find_all(name='i',attrs={'class':'ace-icon fa fa-calendar'})[1].parent.get_text()
    time=re.sub('[
    
    ]','',time)   #登录日期
    user=soup.find_all(name='span',attrs={'class':'user-info'})[0].get_text()
    user=re.sub('[
    	
    欢迎您,]','',user)  #用户姓名
    

      这里需要说明的是获取用户名和日期时需要用re去掉无关字符。

    3. 获取学业信息

      网页上的学业信息见前图。这里同样打开开发者工具,找到相关信息。

      注意这里请求网址又不一样,且为post请求,这就需要找到请求头和请求参数。

      请求参数只有一个为空值。

    '''获取学业信息及本学期课程信息'''
    headers3={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0',
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Referer': 'http://*********/index.jsp',
        'Cookie': 'JSESSIONID=bcdAIJyUvw0e24cRYH8ww;selectionBar=1443374',
        }
    data3={
        'flag':''
        }
    r3=requests.post(url3,headers=headers3,data=data3)
    Academic_info=r3.json()   #读入返回的JSON数据
    passed_course_num=Academic_info[0]['courseNum']    #已修读课程门数
    failed_course_num=Academic_info[0]['coursePas']    #为及格课程门数
    gpa=Academic_info[0]['gpa']              #GPA
    courseName=Academic_info[0]['courseName']    #本学期课程名
    teacherName=Academic_info[0]['teacherName']    #本学期课程教师
    jasName=Academic_info[0]['jasName']         #本学期课程上课教室
    

      这里需要注意的是请求头需要增加’Accept’字段(表示请求的JSON数据),否则会报错。

    4. 获取所有修读课程信息

      在主页面点击成绩查询中的及格成绩,便可以查看各学期各学科成绩。

      同样,在开发者工具中找到相关信息:

      打开第一个课程

    便可以找到所需要的信息。回过头来看下请求头。

      参照编写代码。

    '''获取全部成绩信息并保存JSON文件'''
    url4='http://zhjw.scu.edu.cn/student/integratedQuery/scoreQuery/allPassingScores/callback'
    r4=requests.get(url4,headers=headers3)
    all_grade_info=r4.json()  #导入JSON
    with open('mygrades.json','w',encoding='utf-8') as f:   #保存课程成绩
        json.dump(all_grade_info,f,ensure_ascii=False)
    

      至此,课程信息获取完毕。

    -未完待续


      这里有些问题需要说明一哈:
      1. 我测试时有时发现请求失败,其原因是网页设置了超时时间,Cooikes失效。
      2. 针对上个问题,requests有会话保持的功能。但是我在使用时有问题。

    conn = requests.session()
    

      本篇博客从网页上获取的JSON数据,下篇博客将为你提供查询学期成绩、查询某个学科成绩等功能。教务系统模拟登录与爬取二

  • 相关阅读:
    机器学习入门之二:一个故事说明什么是机器学习(转载)
    机器学习入门之一:背景介绍(转载)
    python 读取CSV文件 中文乱码
    如何快速学习一门新技术(转载)
    Oracle12c多租户如何启动关闭CDB或PDB (PDB自动启动)
    oracle单实例12.2.0.1安装
    PRVF-0002 : could not retrieve local node name
    图形化升级单机oracle 11.2.0.4 到 12.2.0.1
    ORA-00845: MEMORY_TARGET not supported on this system
    行转列、列转行
  • 原文地址:https://www.cnblogs.com/sc340/p/11870813.html
Copyright © 2011-2022 走看看