文章目录
- 前言
- 一、用到的库
- 二、使用python进行爬取
- 1.爬取全校学院的名称
- 2.爬取老师课表
- 总结
前言
虽然教师的个人课表可以登陆es.bnuz.edu.cn教务系统进行查询,但每次只能查看指定的老师,没有别的查询模式,有时不是很方便。所以使用python爬取全校每门课的各种信息到excel中可以自己查找想查的内容。
一、用到的库
需要requests库和json库
import requests
import json
二、使用python进行爬取
1.爬取全校学院的名称
进入eol.bnuz.edu.cn中【信息查询】-【教师个人课表查询】后将鼠标放在2020-2021第二学期按钮上发现左下角出现一个网址:
打开后按F12打开开发者工具选择Network后选择XHR,刷新网页,发现下方获取到四个链接:
点开第二个发现里面包括了学校的所有学院:
知道了这个网址可以返回学院名称可以先用python爬取学校所有的学院为一会爬取每个老师的课作准备。
def get_html(url):
response = requests.get(url)
response.encoding = 'utf-8'
return response.text
#爬取学校所有课程
url = "http://es.bnuz.edu.cn/eam/WebService.asmx/classSelectedInfo?xn=2020-2021&xq=2"
text = json.loads(get_html(url))
print(text[0]['XYMC'])
for i in text:
print("'" + i['XYMC'] + "'" + ", ", end='')
网站的返回数据为一个列表中多个字典,所以使用json.loads()将返回的字符串转换成列表。
最终的结果便是这里的所有教学单位:
2.爬取老师课表
在http://es.bnuz.edu.cn/eam/teacherSchedule.html网站上打开开发者工具的network点击一个学院发现返回一个数据:
发现参数bm和kkxy都为学院,这时就用上第一步爬取的学院了。打开这个网站发现里面是一个学院的所有老师的工号和姓名:
我们就可以构造一个url用来爬取每一个学院的老师信息:
"http://es.bnuz.edu.cn/eam/WebService.asmx/getTask_teacher?bm=" + i + "&kkxy=" + i + "&type=0&xn=2020-2021&xq=2"
#i为之前爬取的学院名称。
现在回到最开始的网站。
在最开始的网站上随便查找一个老师用network监测返回结果发现:
存在多个参数:其中xn为学年、xq为学期、zgh为老师的工号。这个链接打开后为教师上的课程:
所以我们可以构造出一个url:
"http://es.bnuz.edu.cn/eam/WebService.asmx/getTask_info_teacher?xn=2020-2021&xq=2&zgh=" + teacher_id
最后的teacher_id为老师工号。
这里有许多参数,其中几个重要的为
起始周”QSZ"
结束周”JSZ"
单双周”DSZ"
星期几”XQJ"
起始时间段“QSSJD"
上课长度”SKCD"
#中文缩写命名属实优秀(=·ω·=)
有了这些就可以爬取所有的课表了:
# 爬取每一个院的老师名称和ID号
course = [ '信息技术学院', '保卫处', '北京校区', '北师大人文和社会科学高等研究院', '不动产学院', '财务处', '法律与行政学院', '凤凰书院', '工程技术学院', '公共课程中心', '管理学院', '国际交流与合作处', '国际商学部', '国内合作办公室', '教务处', '教育学院', '军事理论教研部', '科研处', '乐育书院', '人事处', '设计学院', '数学教研部', '宋庆龄公益慈善教育中心', '特许经营学院', '通识中心', '图书馆', '团委', '外国语学院', '未来教育学院', '文学院', '物流学院', '校办', '学生处', '研究生处', '艺术与传播学院', '应用数学学院', '运动休闲学院', '招生与就业处', '政治理论教研部', '中加合作办学项目', '珠海校区', '资产处', '公共体育教研部']
for i in course:
teachers = "http://es.bnuz.edu.cn/eam/WebService.asmx/getTask_teacher?bm=" + i + "&kkxy=" + i + "&type=0&xn=2020-2021&xq=2"
text = json.loads(get_html(teachers))
# 爬取每个老师对应的课表
for teacher in text:
teacher_id = teacher['ZGH']
teacher_name = teacher['XM']
teacher_courses = "http://es.bnuz.edu.cn/eam/WebService.asmx/getTask_info_teacher?xn=2020-2021&xq=2&zgh=" + teacher_id
get_courses = json.loads(get_html(teacher_courses))
for j in get_courses:
if j['NAME'] != None:
j['NAME'] = '[' + j['NAME'] + ']'
else:
j['NAME'] = ''
if j['JXBMC'] == '空':
j['JXBMC'] = "无教学班名称"
if j['DSZ'] != None:
j['DSZ'] = '(' + j['DSZ'] + '周' + ')'
else:
j['DSZ'] = ''
if j['JSMC'] == None:
j['JSMC'] = '空'
print(teacher_name + "," + j['KCMC'] + j['NAME'] + "," + "星期" + str(int(j['XQJ'])) + "," + "第" + str(int(j['QSSJD'])) + "-" + str(int(j['QSSJD']+j['SKCD']-1)) + "节" + "," + "第" + str(int(j['QSZ'])) + "-" + str(int(j['JSZ'])) + "周" + j['DSZ'] + "," + j['JSMC'] + "," + j['JXBMC'])
最终输出结果为每个数据用逗号隔开,直接复制粘贴到excle以逗号作为分割就好了。(不怕麻烦也可以写一个csv读入的函数)
最终效果:
总结
大概流程为需要获取到老师的课表就得先获取老师的工号和老师的所在学院。
所以需要先爬取所有的学院–>再爬取每个学院下的老师工号–>最终爬取老师的课程信息。