Perl使用Tesseract-OCR实现验证码识别教程
一、Tesseract-OCR是什么
AnOCREnginethatwasdevelopedatHPLabsbetween1985and1995…andnowatGoogle
基于Leptonica(http://leptonica.com/)图形处理库开的开源图形识别引擎。
支持Linux、Windows、Mac平台,
支持.NET、C++、Python、Java等开发语言:https://code.google.com/p/tesseract-ocr/wiki/AddOns
项目地址:https://code.google.com/p/tesseract-ocr/
二、使用方法
下载安装:https://tesseract-ocr.googlecode.com/files/tesseract-ocr-setup-3.02.02.exe
注意安装时的Path目录、数学符号、语言选项,按需选择。
执行:”tesseractyourpic.pngres”
图片yourpic.png里面的内容会被识别后保存在res.txt
为了更精确的识别可以去到项目地址上下载相应的各种语言的languagetessdata
例如:
简体中文https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.chi_sim.tar.gz
繁体中文
下载解压后chi_sim.traineddata复制到Tesseract-OCR\tessdata即可
执行:
“tesseractyourpic.pngeng”使用默认eng语言包
“tesseractyourpic.pngsim-lchi_sim”使用chi_sim语言包
“tesseractyourpic.pngtra-lchi_tra”使用chi_sim语言包
选择最接近真实数据的,方便以后修正
三、进阶使用Training
为数不多的trainingtesseract-ocr中文文档
http://yy-programer.blogspot.tw/2012/08/training-tesseract-ocr-301.html
对于高精度需求的需要研究一下了,日常民用级别,默认识别加后期修正即可。
四、应用实例之吸附代理
针对http://www.proxyfire.net/几个代理列表页的代理吸附
话不多说直接上代码,
pf.bat
pf.plhttp://www.proxyfire.net/index.php?pageid=eliteproxylist elite.txt pf.plhttp://www.proxyfire.net/index.php?pageid=anonymousproxylist anony.txt pf.plhttp://www.proxyfire.net/index.php?pageid=transparentproxylisttrans.txt pf.plhttp://www.proxyfire.net/index.php?pageid=socks4proxylist s4.txt pf.plhttp://www.proxyfire.net/index.php?pageid=socks5proxylist s5.txt type*.txt>all.tmp del*.txt/s/q renall.tmpall.txt @pause
pf.pl
usestrict; our$url =$ARGV[0]; our$file =$ARGV[1]; my$res=undef; my@tmp=undef; my@pxy=undef; `wget$url-q-O___html`; openFH,"<___html"; @tmp=; closeFH; $res=join('',@tmp); undef(@tmp); `del___html/s/q`; @tmp=($res=~/<imgalt=""src="([^"border="0">]+)><\/td>(\d+)'http://www.proxyfire.net'.$tmp[$i],'port'=>$tmp[$i+1]}; $i=$i+1; } for(my$i=0;$i<@pxy;$i++){ if(length(${$pxy[$i]}{ip})>0) { `echooff&wget${$pxy[$i]}{ip}-q-O___png`; `tesseract___png___-lchi_tra`; my$txt=undef; openFH,"<___.txt"; $txt=; closeFH; if(length($txt)>11) { $txt=~s/\s+//g; $txt=~s/日/8/g; $txt=~s/昍/88/g; $txt=~s/s0/60/g; $txt=~s/s1/61/g; $txt=~s/s2/62/g; $txt=~s/s3/69/g; $txt=~s/s4/64/g; $txt=~s/s5/65/g; $txt=~s/s7/67/g; $txt=~s/s8/68/g; $txt=~s/s9/69/g; $txt=~s/0s/06/g; $txt=~s/1s/16/g; $txt=~s/2s/26/g; $txt=~s/3s/96/g; $txt=~s/4s/46/g; $txt=~s/5s/56/g; $txt=~s/6s/66/g; $txt=~s/7s/76/g; $txt=~s/8s/86/g; $txt=~s/9s/96/g; $txt=~s/ss/66/g; $txt=~s/\.s/\.6/g; ${$pxy[$i]}{ip}=$txt; my$bak1=$txt; my$bak2=$txt; $bak1=~s/13/19/g; $bak1=~s/\.32\./\.92\./g; $bak1=~s/\.33\./\.99\./g; $bak2=~s/19/13/g; $bak2=~s/\.243/\.249/g; $bak2=~s/203\./209\./g; openFHX,">>$file"; printFHX${$pxy[$i]}{ip}.":".${$pxy[$i]}{port}."\n"; printFHX$bak1.":".${$pxy[$i]}{port}."\n"; printFHX$bak2.":".${$pxy[$i]}{port}."\n"; closeFHX; } my$txt=undef; } } `del___*/s/q`; undef($url); undef($file); undef($res); undef(@tmp); undef(@pxy);