Tesseract-OCR牛刀小试:模拟请求时的验证码识别
原文:http://yaohuiji.com/tag/tesseract%EF%BC%8Cocr%EF%BC%8C%E9%AA%8C%E8%AF%81%E7%A0%81/
有个邪恶的需求,需要识别验证码 ,手输几千遍得残了,所以有了这篇小文章,顺便向帅气的Tesseract-OCR致敬,它果然和传说中的一样牛x!
首先,到google code下载Tesseract-OCR的dll和相关语言包。
下载下来后,把dll导入到自己项目里,把语言包解压缩到debug目录下(哪儿都行,但是要有访问权限,然后记下这个目录,后面要用它配置tesseract-ocr)。
然后就可以开始写代码了!
首先,需要模拟一个验证码图片的http请求,这个请求可能也需要cookie,所以在你模拟验证码图片的请求前,很可能需要先请求一下生成相关Cookie的那些页面,把Cookie存到CookieContainer里供后续操作使用。
下面我们先准备2个用来模拟http请求的helper,里面的cookieContainers是个静态字段,这样每次请求就可以共用同一组cookie,这一点很重要。(如果你发现返回的验证码图片是对的,识别后发送过去的值也是对的,但是依然提示验证码错误,原因很可能就是验证码图片的http请求却少cookie。)
请求页面文本的方法:
public static string GetResponse(string url, string method, string data,string encode)
{
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.KeepAlive = true;
req.Method = method.ToUpper();
req.AllowAutoRedirect = true;
req.CookieContainer = CookieContainers;
req.ContentType = "application/x-www-form-urlencoded"; req.UserAgent = IE7;
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Timeout = 50000; if (method.ToUpper() == "POST" && data != null)
{
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] postBytes = encoding.GetBytes(data); ;
req.ContentLength = postBytes.Length;
Stream st = req.GetRequestStream();
st.Write(postBytes, 0, postBytes.Length);
st.Close();
} System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) =>
{
return true;
}; Encoding myEncoding = Encoding.GetEncoding(encode); HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Stream resst = res.GetResponseStream();
StreamReader sr = new StreamReader(resst, myEncoding);
string str = sr.ReadToEnd(); return str;
}
catch (Exception)
{
return string.Empty;
}
请求验证码图片的方法:
public static Stream GetResponseImage(string url)
{
Stream resst = null;
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.KeepAlive = true;
req.Method = "GET";
req.AllowAutoRedirect = true;
req.CookieContainer = cookieContainers;
req.ContentType = "application/x-www-form-urlencoded"; req.UserAgent = IE7;
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Timeout = 50000; System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) =>
{
return true;
}; Encoding myEncoding = Encoding.GetEncoding("UTF-8"); HttpWebResponse res = (HttpWebResponse)req.GetResponse();
resst = res.GetResponseStream(); return resst;
}
catch
{
return null;
}
}
用fiddler抓一下浏览器请求,把相关的URL和POST数据记下来,然后就可以用GetResponse来请求页面的html文本,用GetResponseImage请求验证码图片的Stream。
下面,就该Tesseract-OCR出场了,虽然就这几行,但是最重要的就是这几句了!
private string Recognize(string url)
{
Bitmap bitmap = (Bitmap)Bitmap.FromStream(HttpHelper.GetResponseImage(url)); //如果你的验证码干扰性比较强,可以在这儿对图片进行一些预处理,比如二值化,去噪点什么的,我这个很幸福,没什么干扰,直接就能识别……:-) //初始化ORC
tessnet2.Tesseract ocr = new tessnet2.Tesseract();
//设置识别的内容,这设置的是0到9的数字
ocr.SetVariable("tessedit_char_whitelist", "0123456789");
//初始化语言包,第一个参数是语言包的路径,第二参数是语言包的名字
ocr.Init(Application.StartupPath + @"\tessdata", "eng", true);
//开始识别
List<tessnet2.Word> result = ocr.DoOCR(bitmap, Rectangle.Empty);
//返回识别结果
return result[0].Text;
}
现在调用Recognize方法就有验证码了,最后带着验证码和帐号信息发一个POST请求,分析下响应状态码或者响应内容里是否有登陆成功相关的字符串什么的就搞定了!
ps:参考了几篇文章,都在google里,搜tesseract就能找到。有空了再深入的看看tesseract-ocr,挺好玩的。
Tesseract-OCR牛刀小试:模拟请求时的验证码识别的更多相关文章
- 从session实现机制分析模拟请求验证码的可行性(转)
悲剧了,发现写完这篇blog没有配上这个格调超高的标题. 1.0问题背景 现在要实现一个带验证码网站的的自动登陆功能.验证码识别过程不再这篇文章的讨论之中.(之后有篇文章我会详细的总结验证码的识别 ...
- python利用requests库模拟post请求时json的使用
我们都见识过requests库在静态网页的爬取上展现的威力,我们日常见得最多的为get和post请求,他们最大的区别在于安全性上: 1.GET是通过URL方式请求,可以直接看到,明文传输. 2.POS ...
- Selenium&Pytesseract模拟登录+验证码识别
验证码是爬虫需要解决的问题,因为很多网站的数据是需要登录成功后才可以获取的. 验证码识别,即图片识别,很多人都有误区,觉得这是爬虫方面的知识,其实是不对的. 验证码识别涉及到的知识:人工智能,模式识别 ...
- Selenium&Pytesseract模拟登录+验证码识别
验证码是爬虫需要解决的问题,因为很多网站的数据是需要登录成功后才可以获取的. 验证码识别,即图片识别,很多人都有误区,觉得这是爬虫方面的知识,其实是不对的. 验证码识别涉及到的知识:人工智能,模式识别 ...
- 零OCR基础6行代码实现C#验证码识别
这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...
- Tesseract Ocr引擎
Tesseract Ocr引擎 1.Tesseract介绍 tesseract 是一个google支持的开源ocr项目,其项目地址:https://github.com/tesseract-ocr/t ...
- Python下Tesseract Ocr引擎及安装介绍
1.Tesseract介绍 tesseract 是一个google支持的开源ocr项目,其项目地址:https://github.com/tesseract-ocr/tesseract,目前最新的源码 ...
- 第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别
第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别 第一步.首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://gith ...
- python爬虫模拟登录的图片验证码处理和会话维持
目标网站:古诗文网 登录界面显示: 打开控制台工具,输入账号密码,在ALL栏目中进行抓包 数据如下: 登录请求的url和请求方式 登录所需参数 参数分析: __VIEWSTATE和__VIEWSTAT ...
随机推荐
- 《锋利的jQuery》心得笔记--One Sections
第一章 1. $是jQuery的一个简写形式 2. 在jQuery中无法使用DOM对象的任何方法:比如:$ (“#id”).innerHTML.$ (“#id”).checked, 可以使 ...
- SpringMvc入门三----控制器
在传统的Spring MVC开发方法中,必须在Bean配置文件中为每个控制器类配置实例和请求映射和让每个控制器类去实现或者扩展特定于框架的接口或者基类,不够灵活. 如果Spring MVC可以自动侦测 ...
- ISE 中使用system generate
本文讲解简单的ISE中使用system generate,system generate基本使用规则在此不详细说明可以见博客http://blog.csdn.net/xiabodan/article/ ...
- Java中String类型的不可变性和驻留池
一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创 ...
- corosync+pacemaker实现高可用(HA)集群
corosync+pacemaker实现高可用(HA)集群(一) 重要概念 在准备部署HA集群前,需要对其涉及的大量的概念有一个初步的了解,这样在实际部署配置时,才不至于不知所云 资源.服务与 ...
- silverlight 画图InkPresenter
<UserControl x:Class="SilverlightTest.PolygonTest" xmlns="http://schemas.microsoft ...
- phpStudy for Linux (lnmp+lamp一键安装包)
phpStudy Linux版&Win版同步上线 支持Apache/Nginx/Tengine/Lighttpd/IIS7/8/6 phpStudy for Linux 支持Apache/Ng ...
- 第一次比赛的 C题 (好后面才补的....) CodeForces 546B
Description Colonel has n badges. He wants to give one badge to every of his n soldiers. Each badge ...
- SSH时不需输入密码
我这里有2台机器,一台装了Teradata数据库,ip是192.168.184.128,称它为teradata-pc:另一台装了Oracle数据库,ip地址是192.168.184.129,称它为 ...
- html onclick 传参数
<a id="j-im" class="jd-im btn-gray gys-im" href="javascript:(0);" o ...