分享一个爬取HUST(哈理工)学生成绩的Python程序(OCR自动识别验证码)
Python版本:3.5.2
日期:2018/1/21
__Author__ = "Lance#" # -*- coding = utf-8 -*- from urllib import request from urllib import parse from http import cookiejar from aip.ocr import AipOcr import re class Hust(object): def __init__(self, stu_id, passwd): #登录地址,验证码地址,成绩查询地址 self.__url_check = "http://jwzx.hrbust.edu.cn/academic/getCaptcha.do" self.__url_login = "http://jwzx.hrbust.edu.cn/academic/j_acegi_security_check" self.__url_scoal = "http://jwzx.hrbust.edu.cn/academic/manager/score/studentOwnScore.do" #信息头,模拟浏览器 self.__headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0" } self.__captcha = '' #这里是自已在AI中申请到的ID和KEY self.__APP_ID = 'xxxxxx' self.__API_KEY = 'xxxxxx' self.__SECRET_KEY = 'xxxxxx' #参数信息,在浏览器中可以捕获 self.__post_data = { "groupId": "", "j_username": stu_id, "j_password": passwd, "j_captcha" : '' } ##声明一个CookieJar对象实例 self.__cookie = cookiejar.CookieJar() #利用HTTPCookieProcessor对象来创建cookie处理器 self.__cookieProc = request.HTTPCookieProcessor(self.__cookie) # 通过handler来构建opener self.__opener = request.build_opener(self.__cookieProc) #安装使用这个opener request.install_opener(self.__opener) def ocr_captcha(self): '''ocr识别验证码''' Req = request.Request(self.__url_check, headers=self.__headers) captcha = request.urlopen(Req).read() #AI的接口函数 client = AipOcr(self.__APP_ID, self.__API_KEY, self.__SECRET_KEY) res = client.basicGeneral(captcha) self.__captcha = res['words_result'][0]['words'] def get_captcha(self): '''得到验证码''' return self.__captcha def set_postdata(self): '''设置要发送的参数,就是修改验证码''' self.__post_data["j_captcha"] = self.__captcha def login(self): '''模拟登录''' #urlencode的作用:将字符串以URL编码,用于编码处理 data = parse.urlencode(self.__post_data).encode() Req = request.Request(self.__url_login, headers=self.__headers) html = request.urlopen(Req, data=data) #登录页采用的是GBK编码,这个需要注意 return html.read().decode("GBK") def get_scoal(self): '''获取到成绩信息,并用正则分解''' Req = request.Request(self.__url_scoal, headers=self.__headers) res = request.urlopen(Req).read().decode() #解析HTML采用的正则表达式 pat = re.compile('<td>(.*?)</td>', re.S) list = re.findall(pat, res) #对采集到的数据进行整理 for i, con in enumerate(list): list[i] = con.replace("\n ", "") return list def display(self, list): '''显示成绩信息''' cnt = len(list) new_list = [] cnt -= 3 y = int(cnt / 13) for m in range(y): new_list.insert(m, [list[j] for j in range(3 + m * 13, 16 + m * 13)]) print("学年 学期 及格标志 分数 学分 课程名") for item in new_list: print("{} {} {:>5s} {:5s} {:^5s} {:^20s}".format( item[0], item[1], item[12], item[6].replace('', "").replace("", ""), item[7], item[3])) if __name__ == '__main__': cnt = 1 err_str = "输入的验证码不正确!" #此处是自己的学号和密码 stu = Hust("xxxxxx", "xxxxxx") while True: stu.ocr_captcha() print("识别到的验证码为: %s ------ " % stu.get_captcha(), end="") stu.set_postdata() html = stu.login() if err_str not in html: print("验证码正确") break cnt += 1 print("验证码错误,启动第%d次识别" % cnt) print() print("Scoal Info".center(70, "-")) list = stu.get_scoal() stu.display(list) print("End".center(70, "-"))
完成效果图:
请自动忽略这个人挂科的消息,0.0
可能我理解不周,请谨慎参考,我会后期完善,谢谢支持!
欢迎探讨。
相关推荐
WarGamesdc 2020-06-30
alanlonglong 2020-06-14
doomvsjing 2020-06-11
lybbb 2020-03-27
云之高水之远 2019-11-10
amei0 2019-11-10
luoyouren 2019-10-29
Charliewolf 2019-10-22
chenzhx 2019-09-06
我心飞翔之家 2019-04-01
liuweiITlove 2017-07-28
regina 2015-05-12
Jasterwisdom 2019-07-01
LinBSoft 2019-07-01
那年夏天 2019-06-30
nanqi 2019-06-28
HappinessSourceL 2019-06-28
petal0 2019-05-27