当模拟登陆遇到验证码

简介: 前言环境实施简易示例实战校园图书馆登录效果演示总结前言这两天在看相关于模拟登录的案例,不可避免的遇到了一些验证码相关的问题,在此之前一直使用的是将验证码下载到本地,然后人工肉眼识别的方式。

前言

这两天在看相关于模拟登录的案例,不可避免的遇到了一些验证码相关的问题,在此之前一直使用的是将验证码下载到本地,然后人工肉眼识别的方式。但是效果可想而知,精确度倒是还可以,然而却变得不是很智能了。于是今天来学习一下如何自动识别验证码。

环境

我的实验环境为:

  • Python3.6
  • Pycharm2016.2 Professional
  • Tesseract-OCR-3.0
  • Windows 10 64位

在开始之前确保安装了tesseract引擎,然后是pytesseract这个第三方库。

如果没有安装其实也是可以使用的,那就是借助Python调用系统命令的方式来实现将验证码图片中的内容读入到文本文件,在通过代码读取文本文件得到验证码内容。 但是pytesseract使得这样的一个过程更加简便,所以没有安装的话还是建议安装一下。

pip install pytesseract

读取图片的时候需要PIL库的支持,没有安装的话还是建议先安装一下,否则程序无法进行下去的。

实施

简易示例

import pytesseract
from PIL import Image

image = Image.open(r'checkcode.gif', mode='r')
vcode = pytesseract.image_to_string(image)
print(vcode)

结果为:
图片验证码识别

之所以不在PyCharm中运行, 就是因为会出现一些让人不明所以的错误信息。比如什么

  • FileNotFoundError
  • Permission Denyed
  • .TesseractError: (1, ‘Error opening data file \Software\tesseract\Tesseract-OCR\tessdata/eng.traineddata’)

我也查了相关的资料,发现确实没有什么好点的解决办法,或许可以通过修改pytesseract.py的源码来解决吧, 谁知道呢?

实战校园图书馆登录

# coding: utf8

# @Author: 郭 璞
# @File: DLUTLibraryLogin.py                                                                 
# @Time: 2017/4/7                                   
# @Contact: 1064319632@qq.com
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 大连理工大学图书馆模拟登陆,添加了验证码识别脚本

import requests
import BeautifulSoup
import os, sys
import pytesseract
from PIL import Image


loginurl = 'http://opac.lib.dlut.edu.cn/reader/redr_verify.php'
captchaurl = 'http://opac.lib.dlut.edu.cn/reader/captcha.php'

headers = {
    'Referer': 'http://opac.lib.dlut.edu.cn/reader/login.php',
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36",
}

session = requests.Session()
##### 获取到验证码并保存
checkcodecontent = session.get(captchaurl, headers=headers)
with open('checkcode.jpg', 'wb') as f:
    f.write(checkcodecontent.content)
    f.close()
print('验证码已写入到本地!', '下面开始调用tesseract-OCR引擎识别验证码!')

img = Image.open('checkcode.gif', mode='r')
result = pytesseract.image_to_string(image=img)
checkcode = result
print('验证码为:', checkcode)

# os.startfile('checkcode.jpg')
# checkcode = input('请输入验证码:')
##### 准备登陆图书馆系统
payload = {
    'number':'学号',
    'passwd':'密码',
    'captcha': checkcode,
    'select':'cert_no'
}

response = session.post(loginurl, headers=headers, data=payload)
print('服务器端返回码: ', response.status_code)
soup = BeautifulSoup(response.text, 'html.parser')
## 打印当前用户
username = soup.find('font', {'color': 'blue'})
print(username.get_text())
## 打印积分信息
jifen = soup.find_all('span', {'class': 'bigger-170'})[3]
jifen = str(jifen.get_text())
print('当前登录用户总积分:', jifen)

效果演示

大连理工大学图书馆系统

恩,用户名那点确实出现了乱码,但是从积分那块我们也可以发现确实是登录成功了。相比于第一个版本,使用了pytesseract来处理验证码问题,还真的是比较方便的,最起码不用再手动输入了,这也算是一个进步吧。

最后,需要说明的是在Pycharm中不好用,还非得到CMD中去运行,真的是很无语。

总结

最后又发现一个问题那就是Python36对于Pillow4.1.0不能兼容,安装上去之后会出现各种各样的问题,比如:ImportError: DLL load failed: from . import _imaging as core

解决办法就是安装Pillow4.0.0,反正我是这么解决的了。

对于验证码问题,使用tesseract基本上已经满足需求了。但是很多时候还是不能正确的获取到真实的验证码内容。

而现在网上也有很多专门的服务,通过接口的形式在线处理验证码问题,精准度还是很不错的,有兴趣的话可以尝试一下。

目录
相关文章
|
23天前
|
前端开发 NoSQL 安全
浅谈 前端验证码那些事
浅谈 前端验证码那些事
12 0
|
3月前
|
NoSQL Java Redis
认证服务---整合短信验证码,验证码倒计时,验证码防刷校验 【一】
这篇文章介绍了如何在分布式微服务项目中整合短信验证码服务,包括使用阿里云短信验证接口、将短信验证功能集成到第三方服务中、其他服务的远程调用,以及通过Redis实现验证码防刷机制的代码实现和遇到的问题解决方案。
|
JavaScript 开发工具 Python
KgCaptcha验证码实现笔记
闲来无聊,在网上发现了一个验证码产品KgCaptcha,下面是我用KgCaptcha开发验证码的记录。
KgCaptcha验证码实现笔记
|
JavaScript 开发工具
同一页面生成多个验证码
一个页面需要两个验证码,使用同一个验证码调用两次会导致有前一个失效。那么我们需要创建不同的两个验证码,分别做验证。
同一页面生成多个验证码
|
文字识别 C++ Python
pycharml利用ddddocr和selenium识别验证码并登录
1OCR 2 ddddocr 3使用案例 4 常见问题 代码详情 获得XPATH方法
292 0
|
Web App开发 数据采集 存储
|
Java 开发者
登录功能之添加验证码|学习笔记
快速学习登录功能之添加验证码
159 0
登录功能之添加验证码|学习笔记
|
Web App开发 前端开发
处理一次模拟登录问题
因多系统集成,要实现单点登录,各个系统采用的架构不一,并且改造成本比较高,不能完全使用cas单点登录方案,有的系统年代久远,还需要再IE7 ,IE8等浏览器上运行,所以就有了在chrome上唤起IE浏览器,并模拟其他系统登录的场景。
499 0
处理一次模拟登录问题