使用python抓取广西科技大学教务系统课程表

2016年3月27日 0 条评论 1.16k 次阅读 2 人点赞

因学校教务系统课程表查询功能累赘,服务器经常挂,同时也不适合手机端查询,所以用python开发爬虫抓取所有课程表,放到我的服务器上面。 本文仅供学习。

特性

  1. 中途退出程序再次运行不会抓取到重复课程表
  2. 使用MySQL数据库储存数据,方便管理课程表

注意

请勿复制粘贴本文章代码,因为python对于代码缩进要求非常严格。

请到我的Gihub上面下载源代码 (附班级课表数据库文件):

https://github.com/ping-xiong/python-Guangxi-University-Of-Technology-Timetable

web端查询课程表

https://pingxonline.com/app/timetable

操作环境:

  1. Windows 10 专业版
  2. Python 3.5.1
  3. WampSever 2.5

WampSever 安装

储存课程表需要用到Mysql数据库,所以要下载Wampsever。

下载地址:http://www.wampserver.com/en/

进入网站,往下拉,找到如图所示的位置

根据你系统选择安装32位或者64位的,如果你不知道你系统是多少位,下载32位的即可。

安装完毕后,运行它。

数据库表的导入

运行wampsever后,在桌面右下角状态栏中,鼠标左键点击wampserver图标,如下图,点击phpMyAdmin,进入web版数据库管理页面。

进入到web界面后,左上角处点击new,新建名字为python的数据库

按照图中设置。

选择sql文件导入数据库。

Python 安装

下载地址:https://www.python.org/downloads/

点击Download Python 3.5.1 开始下载,

安装时记得勾选Add python.exe to Path

Python插件安装

安装Python 完毕后,需要安装下列插件。

Beautiful Soup

以管理员模式打开CMD命令提示符,执行命令

pip install beautifulsoup4

PyMySQL 数据库连接插件

以管理员模式打开CMD命令提示符,执行命令

pip install PyMySQL

原理分析

教务管理信息系统课程表链接分析

例如软件G141班课程表的链接:http://202.193.177.7:8081/(S(oaml0r55uwfphs55ssjh43mh))/web_jxrw/cx_kb_bjkb_bj.aspx?xsbh=14040801&xq=15-16-2

从链接的尾部*** .aspx?xsbh=14040801&xq=15-16-2 中的问号?可以看出该网页是用GET的方式请求数据的,第一个参数是xsbh = 14040801,第二个参数是xq = 15-16-2,xq明显是学期拼音首字母缩写,而xsbh应该就是班级编号了。所以我们要先获取所有的班级编号和学期数,然后拼接成班级课表链接,进行遍历抓取课程表:http://202.193.177.7:8081/(S(oaml0r55uwfphs55ssjh43mh))/web_jxrw/cx_kb_bjkb_bj.aspx?xsbh=班级编号&xq=学期

抓取所有学期

教务系统查询课表页面地址:http://202.193.177.7:8081/(S(abwuq2ufugzg1y55p5obk5br))/web_jxrw/cx_kb_bjxzall.aspx

打开链接后,查看网页源代码,所有学期数都是放在ID为DDxq的select标签下的option标签(如图),

然后出现下图,

因为在前端开发中,id这个属性的值是唯一的,所以使用Beautiful Soup选择此处的代码为soup.find(id="DDxq").find_all("option")

这就可以用beautifulsoup插件提取所有学期。

抓取所有学期python代码

 

抓取所有班级和班级编号

同样查看教务系统查询课表页面源代码,所有班级都放在ID为Cxbj_all1_bjlist1的select标签下(如图),直接用beautifulsoup抓取。

图中的option标签value属性就是班级编号,text内容就是班级名字。同样使用beautifulsoup,代码:soup.find(id="Cxbj_all1_bjlist1").find_all("option")

抓取所有班级python代码

 

 

抓取所有课程表

有了班级列表和学期这些数据,我们就可以遍历班级列表和学期列表来拼接成课程表查询链接,提取每个链接中的课程。


同理,在id为GVkb的table标签下,每天的课程都会放在td标签下。

Python代码为soup.find(id="GVkb").find_all("td")

抓取所有课程表python代码

此处分为两个python文件, 请按照注释命名文件,第一个是spider.py,第二个是spider_classTable.py,要放在同一目录下运行。

第一个文件spider.py

 

 

第二个文件spider_classTable.py

 

 

运行抓取课程表python代码

等待抓取。我大概花了6.5个小时才把所有的课程表抓取下来。建议在晚上准备睡觉的时候运行,直到第二天早上。

平兄

做任何一件事情,计划和努力应当留给自己看,成果才适合秀给他人看。

文章评论(0)