利用Tesseract识别58同城图片式手机号码

58同城上的手机号码大多数是图片格式,目的也是防止爬虫软件抓取,但作为一个专门开发爬虫的程序猿,必须拿下它才能安心,否则睡觉做梦也会想着该怎么破这该死的图片号码的!

这里我们利用Google的开源项目:Tesseract-ocr(项目地址:https://github.com/tesseract-ocr)

其实,Tesseract的网上的教程其实有很多,关于它的介绍,我在这里就不说了,直接讲重点!

先是要初始化Tesseract,这里我们用默认的识别库,根据58同城号码图片的特点,我们这样初始化下:

//程序里需要引用:Tesseract.dll以及程序根目录下要有tessdata\\eng.traineddata的识别库文件

Tesseract.TesseractEngine te = new TesseractEngine(Application.StartupPath + "\\tessdata", "eng", EngineMode.Default);//初始化,这里利用默认的识别库

te.SetVariable("tessedit_char_whitelist", "0123456789");//设置识别的字符白名单

te.DefaultPageSegMode = PageSegMode.SingleLine;//设置识别模式为单行模式

注意的是.NET版本貌似必须3.5及以上,否则Tesseract初始化总是不通过。此问题之前困扰了我好久。

首先我们拿到58同城上的图片号码地址如下:

http://image.58.com/showphone.aspx?t=v55&v=6E0C227B5A963FC4VD7B70A4FC12D1D01

下载获取得到下面的图片:

先对图片进行二值化算法(就是变成只有黑白的算法,搜索引擎一搜一堆)得到下面的图片:

这种单色的图片对于OCR引擎来说就友好多了,识别算法:

我们设定一个Bitmap类型变量bTelImg存储这个二值化后的号码图片,String类型sTelNumber用来存数识别结果,利用下面的算法得到识别结果:

Page PG = te.Process(PixConverter.ToPix(bTelImg), PageSegMode.SingleLine);

sTelNumber= KeyReplace(PG.GetText());

识别下:

额... 一万只草泥马奔腾而过,错这么多咋办?难道要用Tesseract的高级训练算法训练个自己的库出来?都说简单识别了,别搞那么复杂好不好,我好懒的!

其实58上这个图片是动态生成的,所以每次访问得到的图片都不一样,包括号码间隔等。第一次下载的图片因为字符图片粘连的问题,导致识别结果不正确,我们对同样的地址再下载一次图片:

二值化:

识别:

哈哈,终于对了!
证明这个免费的OCR引擎直接下载下来不用复杂的训练还是有效的,下面我们在不改变识别算法的前提下,提高识别率(毕竟对于这种纯数字的图片,想OCR的识别率高,只能训练或者写专门的OCR引擎了)

因为第一次识别结果错了,第二次再下载图片,结果却对了。所以我们可以从识别结果下手,不对我们就重新下载图片,再次识别,直到正确或者设定个阀值,达到阀值,不正确我也没办法了!免费的只能这样了!

因为这里我们识别的是手机号码,所以知道手机号码的规律,我们再对结果进行判断,就可以初步判定结果的争取性了!

  1. 手机号码必须为11位纯数字(因为我们设置的白名单是纯数字,所以保证结果是11位就可以了)
  2. 手机号码必须为13,15,18开头的(这个能排除一大部分错误了)

嗯,差不多这两条结果规则可以有效提高识别率了。算法我这里就不写了,是个程序猿都会吧?

至此,一个简单的58 的手机号码图片就完成了。其他诸如电话号码,简单字符验证码,原理也差不多。希望能给初学者一点帮助,后面有机会再和大家讲讲更高级的OCR识别方法。

时间: 2024-10-08 20:50:38

利用Tesseract识别58同城图片式手机号码的相关文章

Python中利用Tesseract软件来识别图片中的英文与中文

OCR与Tesseract介绍   将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同的几个底层OCR 库,或者是在上面进行定制. Tesseract 是一个OCR 库,目前由Google 赞助(Google 也是一家以OCR 和机器学习技术闻名于世的公司).Tesseract 是目前公认最优秀.最精确的开源OCR 系统. 除了极高的精确度,Tesseract 也具有很高的灵活性.它

利用python爬取58同城简历数据

最近接到一个工作,需要获取58同城上面的简历信息(http://gz.58.com/qzyewu/).最开始想到是用python里面的scrapy框架制作爬虫.但是在制作的时候,发现内容不能被存储在本地变量 response 中.当我通过shell载入网页后,虽然内容能被储存在response中,用xpath对我需要的数据进行获取时,返回的都是空值.考虑到数据都在源码中,于是我使用python里的beautifulSoup通过下载源码的方式去获取数据,然后插入到数据库. 需要的python包ur

Python验证码识别--利用pytesser识别简单图形验证码

一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等. 在破解验证码中需要用

利用pytesser识别图形验证码

简单识别 1.一般思路 验证码识别的一般思路为: 图片降噪 图片切割 图像文本输出 1.1 图片降噪 所谓降噪就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只剩下需要识别的文字,让图片变成2进制点阵最好. 对于彩色背景的验证码:每个像素都可以放在一个5维的空间里,这5个维度分别是,X,Y,R,G,B,也就是像素的坐标和颜色,在计算机图形学中,有很多种色彩空间,最常用的比如RGB,印刷用的CYMK,还有比较少见的HSL或者HSV,每种色彩空间的维度都不一样,但是可以通过公式互相转换.

58同城南京品牌公馆数据爬取

做一个租房信息的网站,要爬取58同城上南京品牌公馆的房源信息,因为数字被重新编码了,折腾了一天,记录一下整个过程,留着后面使用. 1,网页分析和字体文件反爬 简单看了下url(https://nj.58.com/pinpaigongyu/pn/1/),比较简单,替换下网址中页码数,就可以一直翻页并进行爬取.分析了下源代码需要爬取的信息,如下图所示,有一些怪异的汉字,刚开始以为是编码问题,后来看了下爬取下来的网页,发现是数字被替换了,应该是有特殊的字体文件. 在script标签中找了一会,发现了下

Python验证码识别:利用pytesser识别简单图形验证码

一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域--    简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等. 在破解验证码中

ThinkPHP仿58同城一站多城市路由配置技巧及二级域名部署技巧

ThinkPHP在PATHINFO的URL模式下,URL的格式类似于http://www.domain.com/appName/module/action 即:http://www.domain.com/分组名/模块名/方法名 或者:http://www.domain.com/模块名/方法名 然而在有些类似于58同城这样的应用中,需要分城市展示不同的页面内容,我们希望在网站域名后面紧跟一个城市目录,也即这种格式: http://www.domain.com/城市名/模块名/方法名,根据不同的城市

58同城加载动画的实现( Android属性动画)

最近看了58同城新版 app ,里面还是做了很多动画特效,其中我看到加载数据时的一个加载动画比较好玩,就试着做了一下,先一起来看看效果 很多人看了这个效果图,第一个疑问就是底下的阴影部分是如何实现的?其实如果真要自己动手实现的话,这个问题反而不是问题,而真正有困难的是,如何控制这个图片上升的时候速度减慢,而下降的时候速度加快,当然这个问题只有在动手做的过程中才会发现. 这里还是按步骤来实现 1.实现整个 LoadingView的布局 public class LoadingLayout exte

转: 58同城高性能移动Push推送平台架构演进之路

转: http://geek.csdn.net/news/detail/58738 文/孙玄 本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需要,原理和方案对比:移动Push推送第一阶段(单平台)架构如何设计:移动Push推送典型性能问题分析解决,以及高可用.高性能.高稳定性如何保证. 什么是移动Push推送 移动Push推送是移动互联网最基础的需求之一,用于满足移动互联环境下消息到达App客户端.以转转(58赶集旗下真实个人的闲置交易平