2020-01-03:识别验证码登录并拉取成绩数据绘制成图表
-
使用PIL,Tesseract-OCR进行验证码识别,Pandas,matplotlib绘制图表
由于PIL库最高支持的Python版本只到2.7,与我的3.8不和,所以我使用了该库的升级版pillow
1.pip安装命令:pip install pillow
2.Tesseract-OCR:下载地址
安装过程:勾选多语言项
用pip命令装进Python
配置系统环境变量
命令行查看安装结果 - 但我使用vs code 跑Python测试代码会报错,代码如下:
from PIL import Image
import pytesseract
code = pytesseract.image_to_string(Image.open(r'E:\learn\install\1.jpg'))
print(code)

Python报错解决方法
-
保存对pytesseract.py的修改,再次运行,可见terminal打出了想要的结果:
运行结果 依赖包安装完成,下面尝试识别验证码并登陆
因为selenium自带的截图是整个浏览器界面,pytesseract无法定位到要识别的图像,所以我定义了cleanImg函数处理截图-
截图处理过程的图像如下:
图像变化过程 从识别验证码到登录的代码如下:用户名和密码隐藏
'''
@CreatTime : 2020/01/02 15:44:56
@Author : FireRain.wyt
@Contact : wuyutongs@allwinnertech.com
@Version : Python 3.8.0
@Description : 尝试识别验证码登录教务系统并且拉取成绩数据绘制成图表
'''
# here put the import lib
from selenium import webdriver
from PIL import Image
import pytesseract
import time
user= 'username'
password= 'password'
login_url= 'http://es.bnuz.edu.cn/'
codeimg_url= 'http://es.bnuz.edu.cn/CheckCode.aspx' # 验证码网址
screenImg= 'E:/learn/python/selenium/CodeImage/screenImg.png' # 图片保存地址
def cleanImg(img_path): # 先处理图像然后才能使用pytesseract进行识别
img= Image.open(img_path)
i=1
j=1
width= img.size[0] # 获得图像长度
height= img.size[1] # 获得图像宽度
for i in range(0,width): # 遍历图像所有像素点
for j in range(0,height):
data= (img.getpixel((i,j))) # 打印图像所有像素点以进行判断
# 对RGBA值进行判断:因为我要将黑色背景变为白色,该黑色为rgb(14,14,14)
if (data[0]==14 and data[1]==14 and data[2]==14): # RGBA:(r,g,b,alpha)
img.putpixel((i,j),(255,255,255,255)) # 将黑色像素变为白色
img= img.convert('L') # 将图片模式由RGB转为灰度,以进行下一步图像简化的处理
img= img.point(lambda x: 0 if x<143 else 255) # 深色点转为黑色,浅色点转为白色,用以消除干扰点
img.save(img_path) # 保存处理后的图像
GD=webdriver.Chrome()
GD.get(login_url) # 先登入要登录网址
GD.get(codeimg_url) # 再进入验证码网址
GD.get_screenshot_as_file(screenImg) # 浏览器截图
cleanImg(screenImg) # 调用自定的cleanImg函数处理获得的图像
code_img= Image.open(screenImg) # 重新打开图片
code= pytesseract.image_to_string(code_img) # 调用pytesseract识别验证码存入code
GD.implicitly_wait(1) # 隐式等待1秒直至code取到值
GD.back() # 返回原登录网址 并将定义好的数据填入
GD.find_element_by_id("TextBox1").send_keys(user)
GD.find_element_by_id("TextBox2").send_keys(password)
GD.find_element_by_id("TextBox3").send_keys(code)
GD.find_element_by_id("RadioButtonList1_2").click()
GD.find_element_by_id("Button4_test").click()
# 登陆成功,下面是获取成绩数据并绘制图表
3.pandas库 pip安装: pip install pandas
4.matplotlib库 pip安装: pip install matplotlib
之后绘制图表的不写在这篇了
这篇blog搞了两天,刚上手Python,尝试识别验证码翻了很多博客,期间还碰到tesseract没有Python3.8对应版本,image尝试定位识别失败等各种糟心的问题。最后搞出来了还是很开心的。
想起之前面试的时候,有位面试官问我:你有没有感受过代码的魅力,感受过它的美感?虽然我最后没有去那家公司,但这个问题真的是让我印象深刻。当时我是一脸懵逼,写代码也有三年多了,到现在为止,我都是感觉解决了什么难题或者实现了什么功能就很开心,至于那位面试官说的美感,本猫可能有生之年不会感觉到了o(●ↀωↀ●)o





