Python>>Selenium_2

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容