青岛大学教务爬虫
来源:互联网 发布:淘宝条码扫描 编辑:程序博客网 时间:2024/04/29 18:50
# -*- coding: utf-8 -*-from PIL import Imageimport ioimport reimport getpassimport requestsimport pytesseractfrom lxml import etreefrom prettytable import PrettyTableclass qdujw: def __init__(self): self.userid = 0 self.s = requests.Session() self.headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36' } # 教务登录 def login(self): global sid, passwd, jw loginurl = 'http://jw.qdu.edu.cn/academic/j_acegi_security_check' codeurl = 'http://jw.qdu.edu.cn/academic/getCaptcha.do' userurl = 'http://jw.qdu.edu.cn/academic/showPersonalInfo.do' # 验证码 code = self.s.get(codeurl, headers=self.headers, stream=True) img = Image.open(io.BytesIO(code.content)) # 降噪 threshold = 140 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) # 将彩色图像转换为灰度图像 imgry = img.convert('L') # 讲图像中噪声去除 out = imgry.point(table, '1') codetext = pytesseract.image_to_string(out, config='digits') # 去除空格,将.替换为0 codetext = codetext.replace(' ', '') codetext = codetext.replace('.', '0') # 登录 postdata = { 'j_username': sid, 'j_password': passwd, 'j_captcha': codetext } r = self.s.post(loginurl, postdata) # 密码错误 if re.search(u'\u5bc6\u7801\u4e0d\u5339\u914d', r.text): print sid + ' 密码不匹配!' print choice = raw_input('请选择(1.重新输入 2.退出):') if choice == '1': sid = raw_input('学号:') passwd = getpass.getpass('密码:') else: exit() jw.login() # 用户名不存在 elif re.search(u'\u4e0d\u5b58\u5728', r.text): print sid + ' 用户名不存在!' print choice = raw_input('请选择(1.重新输入 2.退出):') if choice == '1': sid = raw_input('学号:') passwd = getpass.getpass('密码:') else: exit() jw.login() # 验证码错误 elif re.search(u'\u9a8c\u8bc1\u7801\u4e0d\u6b63\u786e', r.text): print '正在登录,请耐心等待......' jw.login() # 成功 else: userpage = self.s.get(userurl).content name = etree.HTML(userpage.decode( 'utf-8', 'ignore')).xpath('/html/body/center/table[1]/tr[1]/td[2]/text()') for n in name: name = n.encode('utf-8') userid = re.findall(b'.*?userid=(.*?)"', userpage, re.S) for i in userid: self.userid = self.userid * 10 + int(i) print name + '登录成功!' # 查询成绩 def scores(self): print '======= 成绩查询 ========' print year = raw_input('请输入查询学年: ') term = raw_input('春季学期输入[1],秋季学期输入[2]: ') scoresurl = 'http://jw.qdu.edu.cn/academic/manager/score/studentOwnScore.do' # 字符串计算 eval() postdata = { 'year': eval(year + '-' + '1980'), 'term': term, 'para': '0' } scorespage = self.s.post(scoresurl, postdata).content aa = '<td>' + year + '[\s\S]*?<td>.*?</td>[\s\S]*?<td>.*?</td>[\s\S]*?<td>([\s\S]*?)</td>[\s\S]*?<td>.*?</td>[\s\S]*?<td>([\s\S]*?)</td>' # str转types .encode(encoding="utf-8") scores = re.findall(aa.encode(encoding="utf-8"), scorespage, re.S) print print '======= 考试成绩 ========' for s in scores: print print s[0].strip()+' : '+s[1].strip() # 查询课表 def kebiao(self): print '======= 课表查询 ========' print year = raw_input('请输入查询学年: ') term = raw_input('春季学期输入[1],秋季学期输入[2]: ') print # 使用 PrettyTable 打印表格 x = PrettyTable(["周一", "周二", "周三", "周四", "周五", "周六", "周日"]) x.padding_width = 1 get = { 'id': self.userid, 'yearid': eval(year + '-' + '1980'), 'termid': term, 'timetableType': 'STUDENT', 'sectionType': 'COMBINE' } kb = self.s.get( 'http://jw.qdu.edu.cn/academic/manager/coursearrange/showTimetable.do', params=get) html = etree.HTML(kb.content) kb = html.xpath('//*[@id="timetable"]//*[@class="center"]') i = 0 list = [] list1 = ['', '', '', '', '', '', ''] for k in kb: # print k.xpath('string()').encode('utf-8') # 通过 list 将课程信息添加到 PrettyTable 中 if i < 7: list.append( k.text.split(';')[0].replace('<<', '').replace('>>', '')) i += 1 if i == 7: # 上下显示一行空白,方便阅读 x.add_row(list1) x.add_row(list) x.add_row(list1) list = [] i = 0 print x # 教务通知 def news(self): newsurl = requests.get( 'http://jw.qdu.edu.cn/homepage/infoArticleList.do;jsessionid=E06A6E2B5FA3F797FAB8FA5F6331AC92?columnId=358') html = etree.HTML(newsurl.content.decode('utf-8', 'ignore')) news = html.xpath('//*[@id="thirdcontent"]/div[2]/ul/li/div/a') for new in news: print new.xpath('string(.)').encode('utf-8').replace(' ', '').replace('\n', '') print 'http://jw.qdu.edu.cn/homepage/' + new.attrib['href'] print # 个人信息 def user(self): print '======= 个人信息 ========' print user = self.s.get('http://jw.qdu.edu.cn/academic/showPersonalInfo.do') html = etree.HTML(user.content.decode('utf-8', 'ignore')) for n in html.xpath('/html/body/center/table[1]/tr[1]/td[2]/text()'): print '姓名: ' + n.encode('utf-8') for n in html.xpath('/html/body/center/table[1]/tr[2]/td[1]/text()'): print '院系: ' + n.encode('utf-8') for n in html.xpath('/html/body/center/table[1]/tr[2]/td[2]/text()'): print '专业: ' + n.encode('utf-8') for n in html.xpath('/html/body/center/table[1]/tr[4]/td[1]/text()'): print '年级: ' + n.encode('utf-8') for n in html.xpath('/html/body/center/table[1]/tr[4]/td[2]/text()'): print '班级: ' + n.encode('utf-8')jw = qdujw()print '======== 教务通知 ========'jw.news()printprint '======== 登录教务系统 ========'# 学号和密码print '请输入学号和密码'sid = raw_input('学号:')passwd = raw_input('密码:')jw.login()while 1: print print '======== 青岛大学教务系统 ========' print print '[1]查询成绩' print '[2]查询课表' print '[3]个人信息' print '[4]退出' print choice = raw_input('请选择: ') print if choice == '1': jw.scores() elif choice == '2': jw.kebiao() elif choice == '3': jw.user() elif choice == '4': exit()
阅读全文
0 0
- 青岛大学教务爬虫
- 教务系统爬虫
- python爬虫正方教务系统
- [python3]北邮教务爬虫
- python爬虫正方教务系统
- 新版方正教务系统爬虫
- [Python]北京交通大学研究生教务系统爬虫
- 利用java爬虫QDU教务课表
- python 爬虫登陆学校教务系统
- 哈工大(深圳)教务系统 爬虫1.0
- 哈工大(深圳)教务系统Python爬虫1.2
- 哈工大(深圳)教务系统Python爬虫1.3
- python爬虫 爬教务管理-test未完
- 正方教务系统网络爬虫 安全破解
- Golang实现正方教务系统爬虫(一)
- Golang实现正方教务系统爬虫(二)
- java爬虫教务信息门户(java爬虫04)
- python爬虫实例—获取北邮教务GPA
- react-native 极光推送android篇
- hashmap,hashset
- tensorflow: bn层 的 decay参数项
- 第二章:快捷键 我需要的
- 图像分割的papers、github地址及pascal voc排名
- 青岛大学教务爬虫
- Docker 命令
- 记SSM配置时的一些问题的解决方法
- simulink电力系统仿真_matlab2015a
- iOS--如何限制textField输入时小数点后需要的个数
- 《新一代视频压缩编码标准H.264》
- render_to_response()改进HttPResponse
- 第三章:删除项目
- 【Python】【爬虫】关于Beautiful Soup库