nodeJS实现识别验证码(tesseract-ocr+GraphicsMagick)
背景
最近在写一个爬虫的小工具,卡在登录这里。
想爬的网站需要登录才能获取数据,登录又需要输入验证码。
好在验证码是简单的验证码,还可以自己识别试试。
需求分析
1、保存验证码图片
2、识别验证码
3、对识别的验证码进行人工校准
功能实现
1、保存验证码图片
虽然每个网站不一定一样,但是大体的思路是差不多的,我要爬取的网站是后台返回了一个验证码图片和cookie,所以我们需要把这两个东西都存下来。
这里用到了node中的request模块,具体没什么好说的,请求后获取response中的set-cookie,然后再把图片流存下来。request文档
let cookie = "";
let options = {
url: ""
headers: {
Accept: "*/*",
"Accept-Encoding": "utf-8",
"Accept-Language": "zh-CN,zh;q=0.8",
Connection: "keep-alive",'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',//伪装浏览器
},
method: 'GET',
};
let stream = fs.createWriteStream("./code.jpg");
request(options, function (error, response) {
cookie = response.headers["set-cookie"];
}).pipe(stream).on('close', function () {
console.log(cookie);
});
2、识别验证码
识别验证码需要用到两个工具一个是GraphicsMagick,另一个是tesseract-ocr。
2.1 安装工具
在找资料的时候看到很多博客都只写了node安装他们的wrapper工具,都没有写清楚,实际上这两个工具我们都要自行安装,安装包网上找就ok。
GraphicsMagick安装完后需要修改环境变量,在path中添加安装目录的地址,比如我安装在D盘,就添加D盘的路径。

需要注意的是,小写的分号 ; 不要忘记了
完成后输入在命令行输入gm,能出现如下信息就说明安装好了

tesseract-ocr安装完后也需要修改环境变量,操作和GraphicsMagick一样,然后需要多添加一个环境变量TESSDATA_PREFIX,变量值是你安装目录下的tessdata

完成后输入在命令行输入tesseract,能出现如下信息就说明安装好了

2.2安装node下的wrapper工具
GraphicsMagick 安装gm,安装命令是
npm install gm
tesseract-ocr安装tesseractocr,安装命令是
npm install tesseractocr
需要注意的是:找资料的时候发现很多人安装的都是node-tesseract,我在使用的时候一直报-psm这个选项错误,后来去github仓库上面找issue,发现也有人遇到这个问题,原因是我们安装的tesseract是最新的,-psm这个选项已经改成了--psm,所以一直报错。找了一圈也没找到解决办法,所以只好换个包来用。于是在npm的仓库里面找到了tesseractocr这个包。

他的Last publish是一年前,所以就拿来试一试,果然能用。毕竟node-tesseract是5 years ago。。。。
2.3 处理图片为阈值图片
用threshold方法来处理图片,文档的解释是:
Modify the image such that any pixel sample with an intensity value greater than the threshold is assigned the maximum intensity (white), or otherwise is assigned the minimum intensity (black).
说白了就是把图片处理成黑白的,去掉一些噪点线条,因为有噪点线条存在的话,tesseract的识别率会很低,然后阈值默认是55,但是在我的图片上55的阈值丢失的信息太多,所以我就放大了一些。
这里我还用了resize把图片放大一些,因为我在实际操作时发现,很多次识别都报了empty page这个错误,查阅资料发现是由于图片分辨率太小导致的,所以就显式地放大了图片。
gm(imgPath)
.threshold(thresholdVal || 160)
.resize(200, 100)
.write(newPath, (err) => {
if (err) return reject(err);
resolve(newPath);
});
操作之后图片会从下面这样

变成这样

2.4 识别图片
直接调用tesseract来识别图片中的内容,最后将识别出来的内容去空
var recognizer = function (imgPath) {
return new Promise((resolve, reject) => {
recognize(imgPath, (err, text) => {
if (err)
throw err;
else
resolve(text.replace(/[\r\n\s]/gm, ''));
});
})
};
3、对识别的验证码进行人工校准
没有训练过的tesseract其实识别率很低,所以要加一个人工校准的操作,让我们输入的验证码准确率能高一些。
这里用了readline-sync模块获得用户的命令行输入。
recognizer()
.then(text => {
console.log(`识别结果:${text}`);
code = text;
let res = readlineSync.question('是否使用?: ');
if (res.toLowerCase() === 'n') {
code = readlineSync.question('请输入实际值?: ');
}
console.log(code);
})
总结
看看最终效果

识别率虽然不高,但是也有识别正确的,然后也把登录的部分cookie打印出来了,可以说是基本完成了需求。
nodeJS实现识别验证码(tesseract-ocr+GraphicsMagick)的更多相关文章
- 开源图片文字识别引擎——Tesseract OCR
Tessseract为一款开源.免费的OCR引擎,能够支持中文十分难得.虽然其识别效果不是很理想,但是对于要求不高的中小型项目来说,已经足够用了. 文字识别可应用于许多领域,如阅读.翻译.文献资料的检 ...
- C#识别验证码技术-Tesseract
相信大家在开发一些程序会有识别图片上文字(即所谓的OCR)的需求,比如识别车牌.识别图片格式的商品价格.识别图片格式的邮箱地址等等,当然需求最多的还是识别验证码.如果要完成这些OCR的工作,需要你掌握 ...
- Python识别验证码,基于Tesseract实现图片文字识别
一.简介 Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[li ...
- 吴裕雄--天生自然python学习笔记:python 用 Tesseract 识别验证码
用 Selenium 包实现网页自动化操作的案例中,发现很多网页都因 需输入图形验证码而导致实验无法进行 . 解决的办法就是对验证码进行识别 . 识 别的方法之 一 是通过图形处理包将验证码的大部分背 ...
- tesseract ocr文字识别Android实例程序和训练工具全部源代码
tesseract ocr是一个开源的文字识别引擎,Android系统中也可以使用.可以识别50多种语言,通过自己训练识别库的方式,可以大大提高识别的准确率. 为了节省大家的学习时间,现将自己近期的学 ...
- 使用百度ocr接口识别验证码
#!/usr/bin/env python #created by Baird from aip import AipOcr def GetCaptchaV(filename): APP_ID = ' ...
- selenium使用笔记(二)——Tesseract OCR
在自动化测试过程中我们经常会遇到需要输入验证码的情况,而现在一般以图片验证码居多.通常我们处理这种情况应该用最简单的方式,让开发给个万能验证码或者直接将验证码这个环节跳过.之前在技术交流群里也跟朋友讨 ...
- 【转载】loadrunner使用system()函数调用Tesseract-OCR识别验证码遇到的问题
俗话说前人栽树,后人乘凉,此话一点不假,结合云层的一遍文章:http://bbs.51testing.com/thread-533920-1-1.html,知道还有一个Tesseract-OCR可以用 ...
- java识别验证码
所需资源下载链接(资源免费,重在分享) Tesseract:http://download.csdn.net/detail/chenyangqi/9190667 jai_imageio-1.1-alp ...
随机推荐
- uva 12003 Array Transformer (线段树套平衡树)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- oracle用NOT EXISTS替代NOT IN
在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连 ...
- C++ sort使用两个参数来排序
排序在编程中经常用到,冒泡法排序时间复杂度高,使用C++库函数sort可以快速排序. 1.必须的头文件#include < algorithm>和using namespace std; ...
- 自然语言处理课程(二):Jieba分词的原理及实例操作
上节课,我们学习了自然语言处理课程(一):自然语言处理在网文改编市场的应用,了解了相关的基础理论.接下来,我们将要了解一些具体的.可操作的技术方法. 作为小说爱好者的你,是否有设想过通过一些计算机工具 ...
- CSS3 Box-shadow 阴影效果用法
一.基本用法: 二.内阴影用法: 三.阴影扩展长度值: box-shadow: 4rpx 4rpx 8rpx #aaa;
- SVG和canvas画图,js求数组最大最小值
windows命令行的内容怎么复制,右键选择标记,选中内容后再点击鼠标右键就复制了. 安装Node.js后再用npm install命令会出现如下warn:saveError ENOENT: no s ...
- PTA 6-2 多项式求值
PTA 6-2 多项式求值 本题要求实现一个函数 本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑i=0n(a[i]×xi)" role=" ...
- HDU 3397"Sequence operation"(线段树区间和并)
传送门 •题意 给你一个仅包含 0 和 1 的序列: 在这个序列上有如下操作: (1)0 a b : 将 [a,b] 区间的数置 0: (2)1 a b : 将 [a,b] 区间的数置 1: (3)2 ...
- C# 传入 params object 长度
刚刚 LiesAuer 大神问了一个问题,如果在 params object 传入 object 数组,那么拿到的值是的长度是多少 我做了测试在传入不同的值可能拿到不同的长度 先来说总结 传入一个数组 ...
- CSS3 box-sizing 盒子布局
在CSS中盒模型被分为两种,第一种是W3C的标准模型,第二种是IE怪异盒模型.不同之处在于后者的宽高定义的是可见元素框的尺寸,而不是元素框的内容区尺寸.目前对于浏览器大多数元素都是基于W3C标准的盒模 ...