图象识别
Python的强大,在于它有非常多的第三方库。对于验证码识别,Python也已经有了现成的库来供我们使用了。开源的OCR库pytesseract配合tesseract,可以用来将图片中的文字转化为文本。
不过这种方式我们在爬虫中用的并不多。因为现在大部分的验证码都加上了干扰的纹理,已经很少能用单机版的图片识别方式来识别了。所以我们这里仅仅使用简单地图片来进行介绍。如果有一天你的运气足够好,遇到了非常工整的验证码,那么你可以使用这个办法来试一试。
安装 tesseract
(1) Windows
请在这里下载安装包:https://github.com/tesseract-ocr/tesseract/wiki/Downloads
在 3rd party Windows exe's/installer 下面可以找到 exe 安装包。
(2) Mac
使用 homebrew 安装:
$ brew install tesseract |
(3) Linux
使用 apt-get 安装:
$ sudo apt-get install tesseract-orc |
更多的安装帮助信息,可以参阅:https://github.com/tesseract-ocr/tesseract/wiki
安装 Python库
要使用 tesseract 来做图像识别,我们还需要安装两个库:
$ pip install Pillow $ pip install pytesseract |
tesseract的使用
tesseract的使用非常简单,流程如下:
- 导入相关的第三方库
- 打开图片
- 识别
我们可以通过以下代码来实现最简单的图片识别:
import pytesseract from PIL import Image image = Image. open ( '1234.png' ) code = pytesseract.image_to_string(image) print (code) |
如果需要进行操作请保存下面图片:
测试结果如下:
代码:
import pytesseract from PIL import Image image = Image. open ( '1234.png' ) code = pytesseract.image_to_string(image) print (code) |
打码网站的介绍
现在还有一种在线验证码识别的网站。他们雇佣了很多失业者和残疾人来人肉识别验证码,一般十个验证码一分钱左右。我们可以使用这种网站提供的接口来帮助我们识别验证码。这种方式理论上可以识别任何使用输入方式来验证的验证码。
这种打码网站的流程一般是这样的:
- 将验证码上传到网站服务器
- 网站服务器将验证码分发给打码工人
- 打码工人肉眼识别验证码并上传结果
- 网站将结果返回给我们
整个流程走完,在网速良好的白天一般在3-4秒钟,在晚上大概8-10秒钟。
使用在线打码
大家在百度或者谷歌上面搜索:“验证码在线识别”,就可以找到很多提供在线打码的网站。但是由于一般这种打码网站是需要交费才能使用的,所以请一定要注意财产安全!
在这堂课里面,我使用一个叫做云打码的网站来进行测试。网站地址为:http://www.yundama.com/。注册账号以后,需要交费购买“题分”才能正常使用。大家充1元钱就可以了。千万别多充,因为这个网站看起来快要倒闭了,很多文档都没有更新,他们给出的API也有些问题。
这个网站虽然提供了各种语言的SDK,但是版本都比较旧了,所以我推荐大家使用他的HTTP接口:http://www.yundama.com/download/YDMHttp.html
这个页面上给出了上传的地址。大家不要去看它提供的“PythonHTTP调用示例”,因为这个示例有问题。
经过我的研究,它的HTTP接口的正确使用步骤如下:
- 使用POST方式上传图片,并接收返回信息。上传的网址为:http://api.yundama.com/api.php?method=upload 上传参数请看下面的示例。
- 运气和网速足够好的时候,立刻就可以从返回的信息中得到验证码。如果返回的数据没有验证码,转步骤3.
- 获取cid, 并使用GET方式反复访问http://api.yundama.com/api.php?cid=在这里输入你获取到的cid&method=result 直到获取到验证码为止
我这里给出一个正确的使用方式的代码片段:
captcha_username = 'slzcc' #打码网站用户名 captcha_password = '1234567' #打码网站密码 captcha_appid = 1 captcha_appkey = '22cc5376925e9387a23cf797cb9ba745' captcha_codetype = '1004' filename = '1.png' timeout = 15 data = { 'method' : 'upload' , 'username' : captcha_username, 'password' : captcha_password, 'appid' : captcha_appid, 'appkey' : captcha_appkey, 'codetype' : captcha_codetype, 'timeout' : '60' } f = open (filename, 'rb' ) file = { 'file' : f} response = requests.post(captcha_url, data, files = file ).text f.close() response_dict = json.loads(response) '''如果验证码比较简单,或者是白天,这里直接就可以拿到结果''' result = response_dict[ 'text' ] '''如果验证码比较难以识别或者是深夜,需要等待网站的返回结果''' if not result: cid = response_dict[ 'cid' ] while timeout > 0 : response = requests.get(captcha_result_url. format (cid)).text response_dict = json.loads(response) print (response_dict, '——还剩:{}秒...' . format (timeout)) captcha = response_dict[ 'text' ] if response_dict[ 'text' ]: print ( '验证码是: {}' . format (captcha)) break time.sleep( 1 ) timeout - = 1 |
|