python爬虫20 | 小帅b教你如何使用python识别图片验证码
当你在爬取某些网站的时候
对于你的一些频繁请求
对方会阻碍你
常见的方式就是使用验证码
验证码的主要功能
就是区分你是人还是鬼(机器人)
人
想法设法的搞一些手段来对付技术
而
技术又能对付人们的想法
一来一去
就有了各种各样的变态验证码
也有了各种各样的应对方式
常见的验证码有这么几种
图像验证
语音验证
短信验证
极验验证
点击验证
今天
小帅b想跟你先说说如何识别图像验证码
那么
接下来就是

我们来看看这些图片验证码

(此图来源网络)
可以发现
这些验证码大多是数字和字母组成
然后在此之上再添加一些像毛一样的线
或者搞一些噪点
或者把这些字符扭曲一下
为了增加识别难度也是辛苦人家了
接下来我们思考一下
我们要识别这类验证码要怎么做呢

首先要处理一下验证码图片
什么噪点乱七八糟的
我们尽量把它们去掉
让图片
尽量黑白
尽量只剩下字符本身
然后再用 python 强大的 OCR 工具
Python-tesseract
来识别我们优化好的图片
这样正确率就会大大的提高
哎呀
我真是个聪明 boy 啊

为了让你更清楚的知道怎么识别图像验证码
小帅b用 python 搞了几张识别难度不同的验证码
第一张

难度系数: ![]()
第二张

难度系数: ![]()
第三张

难度系数: ![]()
第四张

难度系数: ![]()
第五张

难度系数 : ![]()
先对第一张进行识别
这张看起来没什么 "污染"
所以相对简单
先安装一下 pytesseract
pip install pytesseract
接着安装一下 tesseract-ocr
如果你是 ubuntu 系统可以直接使用如下命令安装
sudo apt install tesseract-ocr
如果你是 win 系统自行 Google 一下安装 tesseract-ocr 以及环境变量配置
完了之后就导入相关模块到我们的代码文件中
try:from PIL import Imageexcept ImportError:import Imageimport pytesseract
接着我们就打开第一张图片
使用 pytesseract 识别
打印一下
captcha = Image.open("captcha1.png")result = pytesseract.image_to_string(captcha)print(result)
打印结果

ok,么有问题

接着我们来识别第 2 张

captcha = Image.open("claptcha2.png")result = pytesseract.image_to_string(captcha)print(result)
结果打印出来是

1924??

这就说明
pytesseract 是没办法识别太多噪点的图片的
如果这个图片再加上一点彩色背景

那么对 pytesseract 来说更是有点吃力的
所以我们先对这张图片灰度处理一下
captcha = Image.open("captcha2.png")result = captcha.convert('L')result.show()
图片就变成灰了

虽然灰了
但是还不够
我们除了处理灰度还需要对其 二值化
def convert_img(img,threshold):img = img.convert("L") # 处理灰度pixels = img.load()for x in range(img.width):for y in range(img.height):if pixels[x, y] > threshold:pixels[x, y] = 255else:pixels[x, y] = 0return img
调用一下
convert_img(captcha,150)
这时候图片就变成这样了

是不是一下子就清晰很多了呢
这时候我们对这张图片识别一下
# 识别一下result = pytesseract.image_to_string(result)print(result)
成功识别

接下来我们再来看看有毛有噪的图片

这时候直接去识别是识别不出来的
所以还是老办法
先处理灰度
再 二值化
这次我们再降一下噪
data = img.getdata()w,h = img.sizecount = 0for x in range(1,h-1):for y in range(1, h - 1):# 找出各个像素方向mid_pixel = data[w * y + x]if mid_pixel == 0:top_pixel = data[w * (y - 1) + x]left_pixel = data[w * y + (x - 1)]down_pixel = data[w * (y + 1) + x]right_pixel = data[w * y + (x + 1)]if top_pixel == 0:count += 1if left_pixel == 0:count += 1if down_pixel == 0:count += 1if right_pixel == 0:count += 1if count > 4:img.putpixel((x, y), 0)
图片变成这样了

再识别一下


不过
pytesseract 不是万能的
对于稍微复杂一点的就识别不出来了
至于这张

你能看出它是 1l1l0oO0 么?
如果你能
算你牛逼

反正小帅b不能
所以 pytesseract 也不能
对于一些简单的验证码
使用 pytesseract 还是可以的
如果你想提高 pytesseract 识别率
还可以去搞些图片去训练一下 tesseract-ocr

ok
以上
主要让你了解一下图片识别库的使用
以及对一些图片的常用降噪操作
那么下次你爬到一些需要图像的简单验证码
应该不在话下了
完
下回见
听说你要 约 我啊!?
peace
点个在看啊~~(破音)

python爬虫20 | 小帅b教你如何使用python识别图片验证码的更多相关文章
- Python爬虫常用小技巧之设置代理IP
设置代理IP的原因 我们在使用Python爬虫爬取一个网站时,通常会频繁访问该网站.假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问.所以你可以设置一些代理服务器来 ...
- python爬虫14 | 就这么说吧,如果你不懂python多线程和线程池,那就去河边摸鱼!
你知道吗? 在我的心里 你是多么的重要 就像 恩 请允许我来一段 freestyle 你们准备好了妹油 你看 这个碗 它又大又圆 就像 这条面 它又长又宽 你们 在这里 看文章 觉得 很开心 就像 我 ...
- 【数量技术宅 | Python爬虫系列分享】实时监控股市重大公告的Python爬虫
实时监控股市重大公告的Python爬虫小技巧 精力有限的我们,如何更加有效率地监控信息? 很多时候特别是交易时,我们需要想办法监控一些信息,比如股市的公告.如果现有的软件没有办法实现我们的需求,那么就 ...
- Python爬虫(小练习)
近日,在浏览伯乐在线(http://blog.jobbole.com/29281/)的时候碰到一些很不错的资源:25本免费的Python电子书 如下图: 其中,每本都是以名字+超链接的方式,于是激起了 ...
- python爬虫下载小视频和小说(基础)
下载视频: 1 from bs4 import BeautifulSoup 2 import requests 3 import re 4 import urllib 5 6 7 def callba ...
- Python爬虫实战小项目
爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据 import requests from fake_useragent import UserAgent ua = UserAge ...
- Python爬虫要学什么?写给小白的Python爬虫必备技能
Python在爬虫方面用得比较多,所以你如果能掌握以下内容,找工作的时候就会顺利很多: 1.爬虫,不是抓取到数据就完事了,如果有数据抽取.清洗.消重等方面经验,也是加分项; 2.大部分的公司都要求爬虫 ...
- 【转】Python OCR识别图片验证码
转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...
- python下以api形式调用tesseract识别图片验证码
一.背景 之前在博文中介绍在python中如何调用tesseract ocr引擎,当时主要介绍了shell模式,shell模式需要安装tesseract程序,并且效率相对略低. 今天介绍api形式的调 ...
随机推荐
- hdu 4587(枚举+割顶)
TWO NODES Time Limit: 24000/12000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- JZOJ 5791 阶乘 —— 因数
题目:https://jzoj.net/senior/#main/show/5791 题意:有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值 ...
- 2-1 创建第一个Vue实例
https://cn.vuejs.org/ 生产版本是经过压缩后的版本,它里面把一些没用的警告的代码删除掉了所以它会更精悍一些. 直接引入CDN的网址我们就可以使用Vuejs了.使用生产版本或者CDN ...
- PCB Genesis脚本 C#调用Javascript
曾经用node.js测试写Genesis脚本失败了,这次借助开发PCB规则引擎的机会(基于JS V8引擎与.net深度交互性), 验证一下Javascript是否可用于写Genesis脚本. 一.测试 ...
- PCB 720全景图嵌入登入界面应用实现
通常软件主界面或登入界面背景图片通常采用固定图片,这里介绍如何将720度全景图嵌入到登入界面中来, 这里用的素材来源于这里上个月在公司里拍摄的全景图, 一.拍摄720度全景图片, 建议:最好用三角固定 ...
- js模拟复制
现在浏览器种类也越来越多,诸如 IE.Firefox.Chrome.Safari等等,因此现在要实现一个js复制内容到剪贴板的小功能就不是一件那么容易的事了. 一.实现点击按钮,复制文本框中的的内 ...
- 什么是JavaScript的原始值?
JavaScript的原始值是指数字.字符串.布尔值.null和undefined. JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(object type ...
- SQLServer局部变量和全局变量介绍05-29学习笔记
变量 数据在内存中存储可以变化的量叫变量.为了在内存中存储信息,用户必须指定存储信息的单元,并为了该存储单元命名, 以方便获取信息,这就是变量的功能.Transact-SQL可以使用两种变量,一种是局 ...
- 如何读取 Json 格式文件
Json 源文件代码: [ { "Id": "0", "Name": "书籍", "Detail": ...
- 【IOS网络编程】socket编程 - Asyncsocket
Phone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作 主要特性有: 队列的非阻塞的读和写,而 ...