四川大学全课表下载程序(python爬虫)

技术栈(requests,openpyxl)

  1. 先用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": ""  # 课程类别}r = requests.post(url=url, data=postdata, headers=headers)m = r.json()["list"]totalcourse = m["pageContext"]["totalCount"]  # 总课数page = totalcourse / 30 + 1while int(postdata["pageNum"]) <= page:  # 存储数据到listcurrentpage = int(postdata["pageNum"])for i in r.json()["list"]["records"]:datalist.append(i)currentpage += 1postdata["pageNum"] = str(currentpage)r = requests.post(url=url, data=postdata, headers=headers)return datalist

这个函数返回每个学院的课程数据集合
接下来定义处理数据的函数顺便保存到excel

def save_to_excel(terms):'''保存数据为excel:return:'''wb = Workbook()ws = wb.activews.append(["课程号", "课序号", "课程名", "学分", "开课院系", "上课教师", "选课限制","校区", "上课教室", "上课星期", "周次", "教学楼", "上课节次"])collogeDic = {'101': '艺术学院', '102': '经济学院', '103': '法学院', '104': '文学与新闻学院', '105': '外国语学院', '106': '历史文化学院(旅游学院)','107': '马克思主义学院', '108': '国际关系学院', '201': '数学学院', '202': '物理科学与技术学院(核科学与工程技术学院)', '203': '化学学院','204': '生命科学学院', '205': '电子信息学院', '300': '高分子科学与工程学院', '301': '材料科学与工程学院', '302': '制造科学与工程学院','303': '电气信息学院', '304': '计算机学院', '305': '建筑与环境学院', '306': '水利水电学院', '308': '化学工程学院', '309': '轻纺与食品学院','311': '软件学院', '312': '四川大学匹兹堡学院', '313': '空天科学与工程学院', '314': '网络空间安全学院', '401': '公共管理学院','402': '商学院', '403': '灾后重建与管理学院', '501': '华西基础医学与法医学院', '502': '华西临床医学院', '503': '华西口腔医学院','504': '华西公共卫生学院', '505': '华西药学院', '506': '华西动物中心', '601': '联合班', '603': '吴玉章学院','604': '生物治疗国家重点实验室', '700': '研究生院', '888': '体育学院', '900': '党委武装部(军事教研室)', '901': '网络教育学院','902': '图书馆', '903': '分析测试中心', '904': '工程设计中心', '905': '工程训练中心', '906': '电子实习中心', '907': '电工电子中心','908': '化学基础实验教学中心', '909': '计算机基础教学实验中心', '910': '招生就业处', '911': '校团委', '912': '心理健康教育中心','913': '国家大学科技园', '914': '海外教育学院', '915': '国际合作与交流处', '918': '实验室及设备管理处', '919': '现代教育技术中心','920': 'IBM技术中心', '925': '文化科技协同创新研发中心', '929': '出国留学人员培训部', '932': '中国西部边疆安全与发展协同创新中心','993': '成都美国留学中心', '997': '创新教育', '998': '党委学生工作部(处)', '999': '其它'}   #学院数据for colloge_id in collogeDic:response_course = query(colloge_id,terms)for each_course in response_course:kch = each_course['kch']  # 课程号kxh = each_course['kxh']  # 课序号kcm = each_course['kcm']  # 课程名xf = each_course['xf']  # 学分kkxsjc = each_course['kkxsjc']  # 开课院系skjs = each_course['skjs']  # 上课教师xkxzsm = each_course['xkxzsm'].strip()  # 选课限制说明kkxqm = each_course['kkxqm']  # 校区jash = each_course['jash']  # 上课教室skxq = each_course['skxq']  # 上课星期zcsm = each_course['zcsm']  # 周次jxlm = each_course['jxlm']  # 教学楼if (each_course['skjc'] != None):jieci = str(each_course['skjc']) + "-" + str(each_course['skjc'] + each_course['cxjc'] - 1)  # 上课节次else:jieci = Nonews.append([kch, kxh, kcm, xf, kkxsjc, skjs, xkxzsm, kkxqm, jash, skxq, zcsm, jxlm, jieci])print("%s数据已完成"%collogeDic[colloge_id])wb.save('%s.xlsx'%terms)

注意博主这里的学院数据是经过处理的到的

本文到这里就结束了,要值得注意的是这个课表请求不用登录,但是我们也要防止请求的频率过快所以要显式的用sleep函数

最后附上本文源代码地址 github
程序交流,bug请发邮箱:w2239559319@outlook.com

四川大学全课表下载程序(python爬虫)相关推荐

  1. Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)

    Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3) 1. 异步加载爬虫 对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问 ...

  2. python 下载文件-python爬虫之下载文件的方式总结以及程序实例

    python爬虫之下载文件的方式以及下载实例 目录 第一种方法:urlretrieve方法下载 第二种方法:request download 第三种方法:视频文件.大型文件下载 实战演示 第一种方法: ...

  3. python怎么下载教程-Python爬虫文件下载图文教程

    而今天我们要说的内容是:如果在网页中存在文件资源,如:图片,电影,文档等.怎样通过Python爬虫把这些资源下载下来. 1.怎样在网上找资源: 就是百度图片为例,当你如下图在百度图片里搜索一个主题时, ...

  4. 【最全笔记】基础Python爬虫入门全笔记

    第一章 网络爬虫之规则 一.Requests库入门 request库:http://www.python-requests.org 安装方法:pip install requests 抓取百度 imp ...

  5. 在当当买了python怎么下载源代码-python爬虫爬取当当网

    [实例简介]python爬虫爬取当当网 [实例截图] [核心代码] ''' Function: 当当网图书爬虫 Author: Charles 微信公众号: Charles的皮卡丘 ''' impor ...

  6. python爬虫下载-用Python爬虫下载整本小说

    1 / 写在前面的话 / 如今网络上很多小说网站都有免费的小说阅读,但是它不提供下载全本的服务,目的也是为了获得更多的流量,资源君就不服了,今天刚好看到一个小说网站,就想弄本小说来看看,于是拿起电脑, ...

  7. python 模拟浏览器下载文件-python爬虫:使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  8. python人工智能pdf_床长人工智能教程pdf下载网校——Python爬虫实战八

    . 声明:本人只是分享一些床长人工智能教程相关的免费pdf下载文档而已,并非床长人工智能网校的收费文章.尊重版权,支持原创! 更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关 ...

  9. python实现登录网站下载文件-Python爬虫 登录网页后下载图片,怎么保持登录状态?...

    在python2中使用Cookielib库进行处理,而在python3中用Cookiejar进行处理 我用的是python3 在代码头部引入模块 import http.cookiejar #创建Co ...

最新文章

  1. 使用TensorRT集成推理inference
  2. php和mvc的认识
  3. Binder fuzz安全研究
  4. Swift之深入解析协议Protocol的底层原理
  5. 聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障
  6. 【Python基础入门系列】第03天:Python 变量与数据类型
  7. C++primer 13.6.2节练习
  8. oracle ^]字符,oracle数据中特殊字符处理
  9. 洛谷 P2324 [SCOI2005]骑士精神
  10. android studio 中 Cannot resolve symbol 'R'(XXX) 如何解决
  11. python内嵌浏览器_内嵌web浏览器
  12. Android 混淆大全一篇就够了
  13. 小 Mil 来了!Milvus 智能问答机器人上线
  14. 电脑开机自动推送微信通知
  15. SpringBoot/SpringMVC整合Shiro:实现登录与注册(MD5加盐加密)
  16. 普陀寺里的穿白T恤的奥特曼 2012年9月8日
  17. 关于cosine_similarity参数的问题
  18. 如何在短时间内提高推广?做好展现量
  19. 【记录】Nginx开源版安装与部署
  20. 拜读台湾清华大学彭明辉教授研究生手册笔记

热门文章

  1. Matlab图形(Figure)中使用差值光标提取数据
  2. 求问:培训机构让我把简历包装成有1-2年工作经验,怎么办?
  3. Win11右键菜单选项变成英文了怎么恢复回来?
  4. 手机端移动端qq在线聊天代码
  5. 爱奇艺19届秋招内推码 7dP4bh 社招也能用
  6. CameraX 三:获取预览流
  7. mui自定义图标(添加新图标)
  8. c++初学者——一个简单的电话簿系统制作
  9. 阿里云、腾讯云、华为云:从内卷到外卷
  10. 红米8.0系统机器最简单激活xposed框架的教程