验证码识别

早过忘川 提交于 2019-11-27 08:15:27

图象识别

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接口的正确使用步骤如下:

我这里给出一个正确的使用方式的代码片段:

captcha_username = 'slzcc' #打码网站用户名
captcha_password = '1234567'  #打码网站密码
captcha_appid = 1
captcha_appkey = '22cc5376925e9387a23cf797cb9ba745'
captcha_codetype = '1004'
captcha_result_url = 'http://api.yundama.com/api.php?cid={}&method=result'
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'}
= 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
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!