新版方正教务系统爬虫

技术 解释
Python 2.7
BeautifulSoup 4.X
Pycharm 2017
Firefox
Firebug
新版教务处地址 218.199.228.43

一、基本原理

GET请求

import urllib2
# 确定要访问的页面地址
url = 'http://****?a=1&b=2'
# 构造 request 请求
request = urllib2.Request(url)
# 返回 response 响应
response = urllib2.urlopen(request)
# 打印输出结果 html页面
result = response.read()
print result

POST请求

import urllib
import urllib2data={username = 'your username'passwd = 'your password'
}
# 确定登录页面 -- 根据请求确定
url = 'http://******'
# 确定请求头 -- request 的请求头信息请参考 http解析
headers = {'User-Agent':...'Cookie':...'Referer':...
}
encoded_data = urllib.urlencode(data)
request = urllib2.Request(url=url, data=encoded_data, headers=headers)
response = urllib2.urlopen(request)
result = response.read()
print result

二、模拟登录

获得登录url

根据地址栏的url进行登录,发现并不能成功,总是返回登录界面。使用Firebug进行抓包分析。

发现真正的登陆url为 http://218.197.80.13/xtgl/login_login.html。
并且登录会对cookie进行检查,选择 cookielib.CookieJar() 进行cookie操作,具体代码

def __init__(self):# 通过登录后获取 cookieself.cookie = ''# 获得模拟登陆后的urlself.res_url = ''# 设置登录成功后的请求头中的Refererself.referer = ''# 定义登陆urlself.login_url = 'http://218.197.80.13/xtgl/login_login.html'# 定义cookieself.cj = cookielib.CookieJar()# 定义用户名和密码self.username = 'your username'self.passwd = 'your password'# 对登陆数据进行编码self.encode_data = urllib.urlencode({# 从网页中分析得到的表单的属性  yhm 、mm, 具体代码见下'yhm': self.username,'mm': self.passwd,})self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))# 模拟登录
def login(self):# 构造请求, 在登录时不检查请求头request = urllib2.Request(self.login_url, self.encode_data)# 得到反馈结果response = self.opener.open(request)# 一系列后续设置self.res_url = response.geturl()self.cookie = self.res_url[46:89].upper()self.referer = self.res_url.replace(';' + self.cookie, '')

由于需要对表单中的用户名和密码框进行分析,故贴上分析代码,也就是获取input框

# 获取界面中的表单提交
def parse_form(html):# 使用 BeautifulSoup进行页面分析,BeautifulSoup的用法见# https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.htmlsoup = BeautifulSoup(html, 'lxml')data = {}for i in soup.find_all('input'):if i.get('name'):data[i.get('name')] = i.get('value')return data

如是需要获取整个页面的代码,使用 download 函数, 下面是download函数的代码

# 第一个参数是需要获得代码的url,第二个是对服务器请求的请求次数,
def download(url, num_retries=2):print('Downloading:', url)try:html = urllib2.urlopen(url).read()except urllib2.URLError as e:print('Download error: ', e.reason)html = Noneif num_retries > 0:if hasattr(e, 'code') and 500 <= e.code < 600:# recursively retry Sxx HTTP errorsreturn download(url, num_retries - 1)return html

最后各种参数配置好之后就直接进行登陆操作就可以了,获取到登录之后的url打印出来就好了,因为两个函数都写在类HBUE中,先创建HBUE类,再进行登录就好。

hbue = HBUE()
hbue.login()
# 打印登陆后的界面
download(hbue.res_url)

于是便成功登录到系统,然后接着进行各种操作

三、获得个人信息

新版方正管理系统个人信息不能通过界面直接获取,会抓到空值,通过抓包分析之后,系统通过GET请求获得了首页的个人数据然后显示在主页上,也只有姓名和总学分两项。

个人数据GET请求数据包分析

重要内容 解释
Cookie JSESSIONID=9DF449637264440BE0110************
Referer http://218.197.80.13/xtgl/index_initMenu.html?jsdm=xs&_t=*
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0

其中通过刚开始登录取得的cookie值来填充进headers中,里面的Referer中,后面的_t参数是系统对时间的一个加密参数,但是通过登录成功后的url中可以分析出来

代码:

header = {'Referer':hbue.res_url,'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0','Cookie':cur_cookie
}new_url = 'http://218.197.80.13/xtgl/index_cxYhxxIndex.html?xt=jw&_='+time+'&gnmkdmKey=index&sessionUserKey='+hbue.username
request = urllib2.Request(url=new_url, headers=header)
print 'request : ', request
response = urllib2.urlopen(request)
print response.read()

通过上面这段代码可以获取首页中的个人信息,包括姓名和总学分等。但是更加重要的班级、学院等信息没有获取到,需要进入到个人信息界面进行获取。于是通过Firebug抓包分析,打开个人信息新界面是通过POST请求来获得界面,通过查看数据包中的POST请求,来构造data字典。

headers = {'Referer': hbue.referer,'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0','Cookie': hbue.cookie,
}
data = {'dyym': '/xsxxxggl/xsgrxxwh_cxXsgrxx.html','gnmkdm': 'N100801','gnmkdmKey': 'index','gnmkmc': '%E6%9F%A5%E8%AF%A2%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF','layout': 'func-layout','sessionUserKey': hbue.username,
}
# 对post的数据进行编码
encoded_data = urllib.urlencode(data)
url = 'http://218.197.80.13/xsxxxggl/xsgrxxwh_cxXsgrxx.html'
req = urllib2.Request(url=url, data=encoded_data, headers=headers)
response = urllib2.urlopen(req)
res = response.read()
soup = BeautifulSoup(res, 'lxml')
inf_id = {'学号': 'col_xh','姓名': 'col_xm','性别': 'col_xbm','证件': 'col_zjhm','专业': 'col_jg_id','学院': 'col_zyh_id','班级': 'col_bh_id',
}
for key, value in inf_id.items():print key, ' : ', soup.find(id=value).get_text().strip()

通过以上代码构造了POST请求,来访问一个新的界面,并且通过Beautiful来获得需要的各种数据

四、获得所有成绩

同样是在个人信息界面,有一个选项板中是成绩信息。若直接进行获取,则跟在首页上获取个人数据一样是空值,这涉及到对动态网页的访问,想要抓取该数据,需要了解网页是如何加载该数据的。该过程被成为逆向工程。打开该选项卡,在Firebug中查看新的请求,会发现网页通过POST提交来获得了成绩信息。查看返回结果,会发现返回的数据是json格式的,便使用Python的json模块把它解析为一个字典,具体代码如下

# 抓包分析url
url = 'http://218.197.80.13/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdmKey=N100801&sessionUserKey=' + hbue.username
# 构造请求头
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0','Cookie': hbue.cookie,'HOST': '218.197.80.13','Referer': 'http://218.197.80.13/xsxxxggl/xsgrxxwh_cxXsgrxx.html',
}
# 通过数据包分析data,其中showCount表示一页显示多少数据
# time为1是因为刚进选项卡时提交过一次数据,代号为0,由于初始设置只会显示10条信息,于是再次进行提交,该一个页面显示90条数据,获取全部成绩
data = {'_search': False,'queryModel.currentPage': '1','queryModel.showCount': '90','queryModel.sortOrder': 'asc','time': '1','xh_id': hbue.username,
}
# 对POST提交数据进行编码
encoded_data = urllib.urlencode(data)
request = urllib2.Request(url=url, data=encoded_daheaders=headers)
response = urllib2.urlopen(request)
res = response.read()
# 通过json解析来得到字典,然后访问全部的课程名称、教师姓名、课程成绩
print '\n所有课程:'
for i in json.loads(res)['items']:print i['kcmc'], i['jsxm'], i['cj']

获取到了所有的课程和结果,其他信息如计算绩点之类的就很简单了

同时课程表、选课信息之类的信息获取也与之类似,通过构造请求来访问就可以了

代码详见:Github

新版方正教务系统爬虫相关推荐

  1. Python实现新版正方教务系统爬虫(二)

    前言 哎对不起 我可能是silly boy 我想在学校里把去年的坑填了 但是发现新版的教务系统代码没传到git上 我现在就成了个对着空ide发呆的憨憨(代码在家里啦 所以填坑就再过会吧 那就稍微闲聊一 ...

  2. python实现高校教务管理系统_Python实现新版正方教务系统爬虫

    目录~ 引入 需要什么软件? 模拟登陆 代码实现(登陆) 模拟获取成绩 代码实现(获取成绩) 解析成绩 测试(完成图) 作者的话 引入 就在我刚刚写完旧版正方系统爬虫的时候(旧版正方系统爬虫代码) 学 ...

  3. JSoup模拟登录新版正方教务系统(内网-教务系统)获取信息过程详解

    新版正方教务系统登录界面: 目录 一.需求分析 二.模拟登录内网 三.模拟登录教务系统 四.爬取成绩和课表信息 参考文章 一.需求分析   需要访问教务系统,爬取出课表成绩等信息,并在自己所写的APP ...

  4. 用Python登陆新版正方教务系统获取课程表(及RSA加密密码实现)

    前言 最近做一个微信小程序,需要登录教务系统.提前用python尝试一下登录接口,并获取到课表打印出来. 我们学校用到新版正方教务系统,长这个样子. 相比旧版的教务系统,唯一好处是不用输入二维码方便爬 ...

  5. go语言爬取新版正方教务系统数据

    go语言爬取新版正方教务系统数据 学完go语言的基础之后已经过了一个多月了,开始想试着利用些时间写写博客,就打算将半个月前练着写的一个go爬虫小项目翻出来写写.由于之前对go爬虫的一些基础知识不熟悉, ...

  6. 广州商学院Python正方教务系统爬虫(获取个人信息成绩课表修改密码)

    使用python的requests库简单爬取,使用xpath解析内容 可以获取个人信息.个人照片.成绩单和课表 github地址:https://github.com/PythonerKK/GZCC- ...

  7. 安卓开发-模拟登陆上海理工大学-方正教务系统(HttpsURLConnection)

    通过HttpsURLConnection模拟登录 今天,写一下基于方正教务系统的上海理工大学教务系统,项目放在了码云,有需要的可以直接翻到最后查看 首先还是登陆一下,看看我们在登陆的时候提交了什么 火 ...

  8. 湖南工业大学教务系统爬虫(模拟登陆篇)

    湖南工业大学教务系统爬虫(模拟登陆篇) 之前写了一个教务系统的爬虫程序,可以根据用户要求爬取任何一部分的数据,也可以模拟提交数据,可能这也是部分工大计算机学生比较感兴趣的,所以今天就在这分享一下整个的 ...

  9. 用java计算学生绩点并排序_JS代码计算GPA平均学分绩点(适合新版正方教务系统)...

    JS代码计算GPA平均学分绩点(适合新版正方教务系统)javascript 新版教务在某些功能上进步很大,可是在GPA统计上,只有全部科目的GPA,没有必修科目的GPA,因此只能本身去写了.java ...

最新文章

  1. 拆解飞机黑匣子,看看内部构造、PCB及芯片
  2. html前台检验特殊字符正则,【Qt编程】html特殊字符及正则表达式
  3. python增删改查csv文件_【练习】Python第四次:实现对文件的增删改查
  4. 技术实践丨React Native 项目 Web 端同构
  5. 这个城市快递外卖小哥将配电子号牌了,违法2起以上停止派单
  6. 使用pinyin4j将中文转换为拼音
  7. android 息屏锁频录音、录视频、电话自动录音
  8. 如何在Windows平台上基于github搭建个人博客平台
  9. 谷歌免费域名邮箱申请全解
  10. 怎么在CAD图纸中标注文字
  11. 笔记本计算机摄像头怎么打开,笔记本都有摄像头吗_笔记本电脑摄像头怎么打开-win7之家...
  12. 百度搜索结果页面的参数 键盘重复速度(rsv_sug3)
  13. SAP AFS ARUN分货操作只争对销售订单行项目上的库存地进行
  14. 龟叔 python_Python 三十而立
  15. 数据挖掘面试 150 道题(附答案)
  16. 在线学习算法FTRL基本原理
  17. 一款基于 Spring Boot 的神仙接私活项目,已开源,2022 接私活必备!
  18. python中json.loads报错: Expecting ‘,‘ delimiter: line 1 column 3545 (char 3544)
  19. 马云关于计算机名言,49句关于马云的名言
  20. Matlab中值滤波

热门文章

  1. 【USB接口程序设计】
  2. 程序员用新华字典学英语
  3. 学计算机的3个奋斗目标,我的学习方法和奋斗目标
  4. 【云服务架构】什么是云原生应用?有哪些特点?来看看阿里云大学公开课给你答案
  5. 已知两边和夹角求第三边长_已知任意三角形的两边和夹角,怎样用三角函数求出第三边的长度...
  6. Oracle存储过程中游标的简单使用
  7. 深入理解设计模式-责任链模式(职责链模式)
  8. 实例分析SQL中除法的三种写法
  9. linux交叉编译 windows,从Windows到Linux的C ++交叉编译器
  10. css直角线_css斜切角 斜边 倒角