教务系统模拟登录与成绩爬取一

版权声明:本文为博主原创文章,转载 请注明出处 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数据,下篇博客将为你提供查询学期成绩、查询某个学科成绩等功能。教务系统模拟登录与爬取二

原文地址:https://www.cnblogs.com/sc340/p/11870813.html