四川大学全课表下载程序(python爬虫)
技术栈(requests,openpyxl)
- 先用chrome抓包分析一下接口 url链接
打开网页是这个样子
我们选一个学院抓包试试
看看请求内容
我们可以看到第一个zxjxjhh是学期的号码,
第二个kkxs现在是什么还不知道,我们搜索一下
网页HTML里面有304刚好后面的value是计算机学院,我们知道这个kkxs是学院的代号
后面的pageNum和pageSize我们先猜一下是当前页数和一次看到的课程数(当前处在第一页)
我们把网页往下划,这时第二页显示出来了同时第二个请求也出来了
打开第二个请求
我们可以看到除了pageNum变成了2其他的都没有变
到这里请求的内容我们大致搞清了:构造要请求的学期代号,从网页的源码里提取学院的代号(这里可以先把网页源码保存再用正则表达式提取),pageNum从1递增!(注意,这里有一个问题,那就是pageNum的上限在哪里,也就是结束一个学院请求的判断条件),固定的pageSize为30
现在开始查看返回的内容
可以看到返回的格式为json,在这里我们就可以看到有一个totalCount,去网页里算了一下总共的课程数就是120门课。records是每门课的集合列表。到现在一切都好办了:pageNum的最大值是totalCount/pageSize+1(想一想这里为什么会加1),请求直到pageNum<=maxPageNum
为止。分析全部完成接下来开始码了
先定义一个获取每个学院课程数据的函数query
def query(kkxs,terms):
'''
:param kkxs:学院编号
:param terms: 学期号,默认2018-2019-2-1,terms格式为2018-2019-2-1
:return:每个学院返回的课表数据
'''
time.sleep(5) #防止请求频率过高
datalist = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
}
url = "http://zhjwjs.scu.edu.cn/teacher/personalSenate/giveLessonInfo/thisSemesterClassSchedule/getCourseArragementPublic"
postdata = {
"zxjxjhh":terms, #学期,默认是18-19第二学期
"kch": "", # 课程号
"kcm": "", # 课程名
"js": "", # 教师
"kkxs": kkxs, # 开课院系
"skxq": "", # 上课星期
"skjc": "", # 上课节次
"xq": "", # 校区
"jxl": "", # 教学楼
"jas": "", # 教室
"pageNum": "1", # 显示的页数
"pageSize": "30", # 每页的课程数
"kclb":