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_score = "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_score(self):
'''获取到成绩信息,并用正则分解''' Req = request.Request(self.__url_score, 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('<span style=" color:#FF0000">', "").replace("</span>", ""),
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("Score Info".center(70, "-"))
list = stu.get_score()
stu.display(list)
print("End".center(70, "-"))

完成效果图:

请自动忽略这个人挂科的消息,0.0

分享一个爬取HUST(哈理工)学生成绩的Python程序(OCR自动识别验证码)的更多相关文章

  1. [W3bsafe]分享一个爬SQL注入漏洞的工具

    分享一个爬SQL注入的工具 本文转自:i春秋社区由团队核心成员若间开发把工具放到E盘的一个文件夹 他会自动生成一个文本文件 Result.txt  最大页数 自己想弄填多少就填多少关键词 注入点关键词 ...

  2. php中CURL技术模拟登陆抓取数据实战,抓取某校教务处学生成绩。

    这两天有基友要php中curl抓取教务处成绩的源码,用于微信公众平台的开发.下面笔者只好忍痛割爱了.php中CURL技术模拟登陆抓取数据实战,抓取沈阳工学院教务处学生成绩. 首先,教务处登录需要验证码 ...

  3. 用Python爬虫爬取广州大学教务系统的成绩(内网访问)

    用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...

  4. 用Python实现一个爬取XX大学电费通知的小脚本

    内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强 ...

  5. 用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)

    简单介绍: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API.仅仅需少量代码就可以实现一个功能强大的爬虫. 怎样将WebCollector导入项目请 ...

  6. 一个爬取Bing每日壁纸的python脚本

    1. 背景 Bing搜索每天的背景图片有些比较适合做桌面,但是有的提供下载有的不提供下载.每天去点击下载又不太方便,所以第一次学习了一下python爬虫怎么写,写的很简单. 2. 相关技术 2.1 P ...

  7. 开源一个爬取redmine数据的测试报告系统

    背景 软件测试的最后有一道比较繁琐的工作,就是编写测试报告.手写测试报告在数据统计和分析上面要耗费比较大的事件和精力.之前工作室使用mantis管理bug缺陷.公司有内部有个系统,可以直接从manti ...

  8. 一个爬取https和http通用的工具类(JDK自带的URL的用法)

    今天在java爬取天猫的时候因为ssl报错,所以从网上找了一个可以爬取https和http通用的工具类.但是有的时候此工具类爬到的数据不全,此处不得不说python爬虫很厉害. package cn. ...

  9. 一个爬取lativ诚衣网站上模特穿搭图片的爬虫

    show the code: [peter@localhost savvy]$ vi lativ.py # -*- coding:utf-8 -*- import requests,lxml,os f ...

随机推荐

  1. vue学习-自动行合并的table

    测试的效果 测试的html源码截图 v-table在tableGroup.js中定义,以下就render方法,行的所有单元格都在tableGrouper.js中处理 render:function(h ...

  2. php实现最简单的MVC框架实例教程

    本文以一个实例的形式讲述了PHP实现MVC框架的过程,比较浅显易懂.现分享给大家供大家参考之用.具体分析如下: 首先,在学习一个框架之前,基本上我们都需要知道什么是mvc,即model-view-co ...

  3. Jquery 在子页面上设置父页面元素的值

    使用情景:因为我父页面上有用art.dialog,而子页面上有项目中的框架弹出方法跟art.dialog冲突,不能使用art.dialog自带的方法传值, 所以只好用一种简单粗暴的方法来设置. var ...

  4. linux(Redhat7)安装Apache

    1.下载apache安装包以及安装依赖的包(apr.apr-util.pcre)wget https://mirrors.cnnic.cn/apache/httpd/httpd-2.4.37.tar. ...

  5. Linux-系统编程-知识点概述

    1.基本指令和5个背景知识(os.env.file.shell.权限) 2.开发环境:(vim.gcc.g++.gdb.ctags.make.Makefile.procbar) 3.进程1: 进程的基 ...

  6. 手把手教你Chrome浏览器安装Postman(含下载云盘链接)【转载】

    转载自:http://www.ljwit.com/archives/php/278.html 说明: Postman不多介绍,是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件.本文主要 ...

  7. 吴恩达机器学习笔记31-梯度检验(Gradient Checking)

    当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解.为了避免这样的问题,我们采取一种叫做梯度的 ...

  8. 解决微信小程序的wx-charts插件tab切换时的显示会出现位置移动问题-tab切换时,图表显示错乱-实现滑动tab

    解决Echarts在微信小程序tab切换时的显示会出现位置移动问题 tab切换时,图表显示错乱 <canvas class="kcanvas" canvas-id=" ...

  9. Kali学习笔记18:OpenVAS使用

    上一篇讲了什么是OpenVAS以及如何安装: https://www.cnblogs.com/xuyiqing/p/9690373.html 接下来就是使用: 我先打开一台Metasploitable ...

  10. [Postman]定制Postman(4)

    自定义请求方法 您可以在Postman中自定义请求方法以满足特定要求.创建自己的请求方法后,您将能够发送/保存它们. 此功能允许您保存/删除自定义方法,还可以删除默认方法.单击请求方法下拉区域,键入方 ...