使用Python批量获取学生期末考试成绩

以下是我们学校对于期末考试成绩临时查询的一个网站

 

 我突发奇想,可不可以通过爬虫的方式批量获取成绩信息

于是说干就干

首先观察网页的请求

 

 

 

 

通过查看,我们可以很明显看到网站查询是通过对https://wxzx.cqyti.com/wxProject/ScoreQuery.do进行post请求而来的,令人惊讶的是网页上要填写的姓名和辅导员根本没有post上去

这大大降低了我们爬取数据的难度!!!

我们可以看到,只post了三个数据 分别是

 

所以我们只需要通过循环生成xh所对应的学号 在带上固定的“year”和“term”即可

首先载入所需要的库

import requests
import re

定义请求的url和伪装请求头

#定义请求的url
url = 'https://wxzx.cqyti.com/wxProject/ScoreQuery.do'
#定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0'
}

接下来就是获取数据了

首先我们需要打开一个文本文件用于写入最终的结果

我们定义一个sum来提示我们已经录入了多少

#post的数据
file = open("E:/成绩.txt", "w")
sum = 0 #用于提示总共记录了多少学生
for i in range(2019211600,2019211711):
    head = '学号为%d的同学的成绩\n'%(i) #准备好同学的学号用于写入

    print (head)                        #用于提醒正在记录的同学的学号
    data = {'xh' : str(i) , 'year' :'2019-2020' , 'term':'1' } #定义data 将生成的学号放入

    #    发起post请求
    res = requests.post(url=url ,headers=headers,data =data)
    data_get = res.json()

接下来我们来分析一下所保存的data文件

 

 

我们可以很清楚的看到我们所需要的信息就在data_get中的"xskscj”内的 "scorename"与"value"中因此我们可以直接从data_get中切片选取

#写入文本
    k = 0 #初始化k的值,用于接下来遍历字典

    file.write(head) #将学号写入文本
    for ii in data_get['xskscj']: #通过循环遍历字典将成绩和学号写入文本

        kecheng = data_get['xskscj'][k]['scorename']
        fenshu = data_get['xskscj'][k]['value']
        k=k+1
        jieguo = kecheng + ':' + str(fenshu)+''
        print(jieguo)

        file.write(jieguo)
    file.write('\n')
    print('录入成功')
    sum= sum + 1 # 用于计算录入的同学总数
    print('共计录'+ str(sum) + '名同学')

最后记得关闭文本文件

file.close() #关闭文本文件

最后经过简单的调试就ok啦

 

 

posted @ 2020-01-02 05:36  Mr、Kr  阅读(3682)  评论(3编辑  收藏  举报