文字识别还能这样用?通过Python做文字识别到破解图片验证码
前期准备
1. 安装包,直接在终端上输入pip指令即可:
# 发送浏览器请求
pip3 install requests
# 文字识别
pip3 install pytesseract
# 图片处理
pip3 install Pillow
PS:如有需要Python学习资料的小伙伴可以加下方的群去找免费管理员领取
可以免费领取源码、项目实战视频、PDF文件等
2. 新建项目
需要的模块安装好后,新建一个项目wordsDistinguish。
在项目包下新建三个.py文件
test_pytesseract 和 test_pillow、case_verification。
test_pytesseract:模块 pytesseract 的基本使用测试
test_pillow:模块 Pillow 的基本使用测试
case_verification:实战案例,破解网站图片验证码验证
涉及知识
1.Pillow 中的 Image
Python图像库中最重要的类是 Image,在模块中定义的具有相同名称的类。
可以通过多种方式创建此类的实例; 通过从文件加载图像,处理其他图像或从头开始创建图像。
# -*- coding: utf-8 -*- # 注意:print_function的导入必须在Image之前,否则会报错
from __future__ import print_function
from PIL import Image
"""
pillow 模块 中 Image 的基本使用
""" # 1.打开图片
im = Image.open("../wordsDistinguish/test1.jpg")
print(im) # 2.查看图片文件内容
print("图片文件格式:"+im.format)
print("图片大小:"+str(im.size))
print("图片模式:"+im.mode) # 3.显示当前图片对象
im.show() # 4.修改图片大小,格式,保存
size = (50, 50)
im.thumbnail(size)
im.save("1.jpg", "PNG") # 5.图片模式转化并保存,L 表示灰度 RGB 表示彩色
im = im.convert("L")
im.save("test1.jpg")
2. 基于 Tesseract-OCR 的 pytesseract
Python-tesseract是python的光学字符识别(OCR)工具。也就是说,它将识别并“读取”嵌入图像中的文本。
Python-tesseract是Google的Tesseract-OCR引擎的包装器。
它作为独立的调用脚本也很有用,因为它可以读取Pillow和Leptonica成像库支持的所有图像类型,包括jpeg,png,gif,bmp,tiff等。
此外,如果用作脚本,Python-tesseract将打印已识别的文本,而不是将其写入文件。
要在你的电脑上使用pytesseract模块,你还需要安装 Tesseract-OCR ,Mac上安装该工具我比较建议使用Homebrew,安装好后,直接在终端输入下面指令即可:
Windows下安装的话直接下载包即可,然后把其加入系统环境变量(即加入Path里),比较傻白甜,可以百度一下。
# -*- coding: utf-8 -*- # 从 Pillow 中导入图片处理模块 Image
from PIL import Image
# 导入基于 Tesseract 的文字识别模块 pytesseract
import pytesseract
"""
@pytesseract:https://github.com/madmaze/pytesseract
""" # 打开图片
im = Image.open("../wordsDistinguish/Resources/1.jpg")
# 识别图片内容
text = pytesseract.image_to_string(im)
print(text)
小项目:破解图片验证码登陆
目标网站:https://so.gushiwen.org
1. 准备过程
登录过程中需要输入三个数据:账号、密码、验证码,首先在浏览器内实际登录一次,按F12查看登录流程。
输入账号密码,和验证码,点击登录,注意Network内的变化。
登录后,分析Network内加载的网页我们发现,在login.aspx里,传递了我们的登录信息。
这是关键,意味着我们只要把数据通过这个地址传递给服务器就可以实现登录了。
2. 代码敲起来
现在模拟登录过程的难点主要有:验证码的识别和传递。
a.验证码识别我们根据前面的知识知识里的,直接采用pytesseract模块。b.登录参数传递,利用requests库发送post请求即可,问题是如何把验证码和登录联系起来.
通过前面分析我们知道
验证码是在
“https://so.gushiwen.org/RandCode.ashx”里生成的,
而登录页面是
“https://so.gushiwen.org/user/login.aspx”,分析发现。
正常浏览器登录这两个网址的cookie是一致的,并且都带有时间戳,所以,只要在代码请求时保证两者的cookie一致即可,这里我们利用requests库的session方法可以实现。
# -*- coding: utf-8 -*- # 从 Pillow 中导入图片处理模块 Image
from PIL import Image
# 导入基于 Tesseract 的文字识别模块 pytesseract
import pytesseract
# 导入发送网络请求的库 requests
import requests
# 导入正则库 re
import re
"""
模拟登录,破解字母数字图片验证码
目标网站:https://so.gushiwen.org
"""
# 请求头
headers = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"
}
# 通过requests 创建一个 session 会话,保持两次访问 cookie 值相同
session = requests.session() # 下载识别验证码图片函数
def get_verification():
# 生成验证码图片url
url = "https://so.gushiwen.org/RandCode.ashx"
# 通过session发送get请求,获取验证码
resp = session.get(url, headers=headers)
# 将验证码保证到本地
with open(r"../wordsDistinguish/Resources/test.jpg", 'wb') as f:
f.write(resp.content)
# 打开验证码图片文件
im = Image.open(r"../wordsDistinguish/Resources/test.jpg")
# 基本处理,灰度处理,提升识别准确率
# 保存处理后的图片
im.save("test.jpg")
# 利用pytesseract进行图片内容识别
text = pytesseract.image_to_string(im)
# 去除识别结果中的非数字/字母内容
text = re.sub("\W", "", text)
# 返回验证码内容
return text def do_login(): i = 0 # 识别错误次数
# 获取验证码
captcha = get_verification()
# 基本检验,验证码位数必须为四位
while len(captcha) != 4:
captcha = get_verification()
i = i + 1 # i+=1
print("第%d次识别错误" % i) print("开始登录,验证码为:"+captcha)
# 传递的登录参数
data = {
"from": "http://so.gushiwen.org/user/collect.aspx",
"email": "你的注册邮箱",
"pwd": "你的登录密码",
"code": captcha,
"denglu": "登录"
}
# 登录地址
url = "https://so.gushiwen.org/user/login.aspx"
# 利用 session 发送post请求
response = session.post(url, headers=headers, data=data)
# 打印登录后的状态码
print(response.status_code)
# 保存登录后的页面内容,进一步确认是否登录成功
with open("gsww.html", encoding="utf-8", mode="w") as f:
f.write(response.content.decode()) # 开始程序
if __name__ == "__main__":
do_login()
3. 运行结果
a.控制台显示一次验证成功,返回状态码为:200,访问正常。
b.进一步检查,对获取到的源码进行检查
我们在浏览器观察登录后的页面发现,只有登录后的页面才有账号管理模块。
其中有用户的唯一标识:绑定邮箱的后几位,我的是50471@qq.com。
所以在我们获取的源码里直接搜索50471@qq.com即可查明是否登录成功,我们发现可以查询到,即模拟登录成功了。
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
文章来源于简说Python
作者:老表
文字识别还能这样用?通过Python做文字识别到破解图片验证码的更多相关文章
- Python开发【Django】:图片验证码、KindEditor
图片验证码 生成图片验证码需要以下: session check_code.py(依赖:Pillow,字体文件) 模块安装 pip install Pillow src属性后面加? 在utils下拷贝 ...
- 使用python内置库pytesseract实现图片验证码的识别
环境准备: 1.安装Tesseract模块 git文档地址:https://digi.bib.uni-mannheim.de/tesseract/ 下载后就是一个exe安装包,直接右击安装即可,安装完 ...
- 使用Python进行OCR -- 识别图片中的文字
工具 Tesseract pytesseract tesserocr 朋友需要一个工具,将图片中的文字提取出来.我帮他在网上找了一些OCR的应用,都不好用.所以准备自己研究,写一个Web APP供他使 ...
- 字符型图片验证码识别完整过程及Python实现
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- 字符识别Python实现 图片验证码识别
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- KNN识别图像上的数字及python实现
领导让我每天手工录入BI系统中的数据并判断数据是否存在异常,若有异常点,则检测是系统问题还是业务问题.为了解放双手,我决定写个程序完成每天录入管理驾驶舱数据的任务.首先用按键精灵录了一套脚本把系统中的 ...
- 基于Python使用SVM识别简单的字符验证码的完整代码开源分享
关键字:Python,SVM,字符验证码,机器学习,验证码识别 1 概述 基于Python使用SVM识别简单的验证字符串的完整代码开源分享. 因为目前有了更厉害的新技术来解决这类问题了,但是本文作 ...
- Python实现文字聊天室
你是否想过用所学的Python开发一个图形界面的聊天室程序啊? 像这样的: 如果你想开发这样一个有点怀旧风格的聊天程序,那么可以接着看: 要开发这个聊天程序,你需要具备以下知识点: asyncore ...
- 使用OpenCV和Python进行人脸识别
介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...
随机推荐
- CVE-2020-5902 简单复现
这几天通报了f5的一个漏洞,想着先弄个环境保存着,说不定后面就用到了.. 1.漏洞描述 近日,F5官方发布公告,修复了流量管理用户界面(TMUI)中存在的一个远程代码执行漏洞(CVE-2020-5 ...
- Windows配置Delve的测试环境
引言 自己最近在玩Go,在开发一些项目的时候需要调试,由于之前都是在GoLand上写的,但是这个IDE启动太慢并且不轻便.并且自己之前很多项目都是在Vscode中编写的,所以特意想在Vscode中配置 ...
- Tomcat更改错误页面指向,改变404,500错误页面
在公司工作了一段时间,也被安排做了一个App,而且后台也是我来写和布置的,由于一次安全检查,需要我把tomcat默认页(管理页面)关闭,于是我只能进行默认指向变更,但是后面我又想到要是用户输入不存在的 ...
- celery 基础教程(二):简单实例
前言 使用celery包含三个方面:1. 定义任务函数.2. 运行celery服务.3. 客户应用程序的调用. 实例一: #1. 定义任务函数 创建一个文件 tasks.py输入下列代码: from ...
- java 面向对象(三):类结构 属性
类的设计中,两个重要结构之一:属性 对比:属性 vs 局部变量 1.相同点: * 1.1 定义变量的格式:数据类型 变量名 = 变量值 * 1.2 先声明,后使用 * 1.3 变量都其对应的作用域 2 ...
- 数据可视化之powerBI技巧(六)在PowerBI中简单的操作,实现复杂的预测分析
时间序列预测就是利用过去一段时间内的数据来预测未来一段时间内该数据的走势,比如根据过去5年的销售数据进行来年的收入增长预测,根据上个季度的股票走势推测未来一周的股价变化等等. 对于大部分人来说,这是个 ...
- 机器学习实战---决策树CART回归树实现
机器学习实战---决策树CART简介及分类树实现 一:对比分类树 CART回归树和CART分类树的建立算法大部分是类似的,所以这里我们只讨论CART回归树和CART分类树的建立算法不同的地方.首先,我 ...
- 证明:ThreadLocal的get,set方法无法防止内存泄漏
先给出结论:get,set两个方法都不能完全防止内存泄漏,还是每次用完ThreadLocal都勤奋的remove一下靠谱. 前言: 看到有的博客说在把ThreadLocal的所有强引用置空前,调用 ...
- 3个月不发工资,拖延转正?2天跳槽软件测试成功,9.5k他不香吗!
今天聊到的小哥哥很悲催又很神奇,身处武汉的他,正好赶上了疫情,不仅长达3个月没有发工资,拖延转正,还要降薪,三重打击,实名悲催. 不破不立,试用期80%再打8折,怎么跳槽工资都得比这高,果然,仅仅两天 ...
- 第一章:Activity的生命周期和启动模式
Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息 (一)Activity的生命周期 1.1.1 正常情况下的生命周期 ...