python爬取北师大珠海分校全校课程表


前言

虽然教师的个人课表可以登陆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都为学院,这时就用上第一步爬取的学院了。打开这个网站发现里面是一个学院的所有老师的工号和姓名:

zgh为工号,xm为姓名
我们就可以构造一个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读入的函数)
最终效果:



总结

大概流程为需要获取到老师的课表就得先获取老师的工号和老师的所在学院。

所以需要先爬取所有的学院–>再爬取每个学院下的老师工号–>最终爬取老师的课程信息。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值