验证码识别
图象识别
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
|
|