四川大学全课表下载程序(python爬虫)
四川大学全课表下载程序(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": "" # 课程类别}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爬虫)相关推荐
- Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)
Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3) 1. 异步加载爬虫 对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问 ...
- python 下载文件-python爬虫之下载文件的方式总结以及程序实例
python爬虫之下载文件的方式以及下载实例 目录 第一种方法:urlretrieve方法下载 第二种方法:request download 第三种方法:视频文件.大型文件下载 实战演示 第一种方法: ...
- python怎么下载教程-Python爬虫文件下载图文教程
而今天我们要说的内容是:如果在网页中存在文件资源,如:图片,电影,文档等.怎样通过Python爬虫把这些资源下载下来. 1.怎样在网上找资源: 就是百度图片为例,当你如下图在百度图片里搜索一个主题时, ...
- 【最全笔记】基础Python爬虫入门全笔记
第一章 网络爬虫之规则 一.Requests库入门 request库:http://www.python-requests.org 安装方法:pip install requests 抓取百度 imp ...
- 在当当买了python怎么下载源代码-python爬虫爬取当当网
[实例简介]python爬虫爬取当当网 [实例截图] [核心代码] ''' Function: 当当网图书爬虫 Author: Charles 微信公众号: Charles的皮卡丘 ''' impor ...
- python爬虫下载-用Python爬虫下载整本小说
1 / 写在前面的话 / 如今网络上很多小说网站都有免费的小说阅读,但是它不提供下载全本的服务,目的也是为了获得更多的流量,资源君就不服了,今天刚好看到一个小说网站,就想弄本小说来看看,于是拿起电脑, ...
- python 模拟浏览器下载文件-python爬虫:使用Selenium模拟浏览器行为
前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...
- python人工智能pdf_床长人工智能教程pdf下载网校——Python爬虫实战八
. 声明:本人只是分享一些床长人工智能教程相关的免费pdf下载文档而已,并非床长人工智能网校的收费文章.尊重版权,支持原创! 更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关 ...
- python实现登录网站下载文件-Python爬虫 登录网页后下载图片,怎么保持登录状态?...
在python2中使用Cookielib库进行处理,而在python3中用Cookiejar进行处理 我用的是python3 在代码头部引入模块 import http.cookiejar #创建Co ...
最新文章
- 使用TensorRT集成推理inference
- php和mvc的认识
- Binder fuzz安全研究
- Swift之深入解析协议Protocol的底层原理
- 聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障
- 【Python基础入门系列】第03天:Python 变量与数据类型
- C++primer 13.6.2节练习
- oracle ^]字符,oracle数据中特殊字符处理
- 洛谷 P2324 [SCOI2005]骑士精神
- android studio 中 Cannot resolve symbol 'R'(XXX) 如何解决
- python内嵌浏览器_内嵌web浏览器
- Android 混淆大全一篇就够了
- 小 Mil 来了!Milvus 智能问答机器人上线
- 电脑开机自动推送微信通知
- SpringBoot/SpringMVC整合Shiro:实现登录与注册(MD5加盐加密)
- 普陀寺里的穿白T恤的奥特曼 2012年9月8日
- 关于cosine_similarity参数的问题
- 如何在短时间内提高推广?做好展现量
- 【记录】Nginx开源版安装与部署
- 拜读台湾清华大学彭明辉教授研究生手册笔记