验证码识别

点触验证码识别

爬虫遇到最多的就是验证码,验证码也是当前最为有效的反爬措施,python中机器视觉也有相关的模块解决这种情况

一、概述

1. OCR

光学字符识别(Optical Character Recognition)

2. 原理

通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为电子文本

3. tesserct-ocr

OCR的一个底层识别库(不是模块,不能导入)

Google维护的开源OCR识别库

4. pytesseract

Python模块,可调用底层识别库

对tesseract-ocr做的一层Python API封装

安装

  • Ubuntu

    sudo apt-get install tesseract-ocr

  • Windows

    下载安装包``

    字体库https://github.com/tesseract-ocr/tessdata

  • 测试

    终端 | cmd命令行

    tesseract xxx.jpg 文件名

二、在线打码

网络上在线打码平台不计其数,这里以云打码为例

tesseract-ocr识别率很低,文字变形、干扰,导致无法识别验证码

1. 使用

  • 下载并查看接口文档
  • 调整接口文档,调整代码并接入程序测试
  • 真正接入程序,在线识别后获取结果并使用

该演示涉及网站会员信息,不便展示,只做简要提示

  • 下载API示例点击下载

  • 写一个方法将其封装起来,记得填好自己的用户名和密码

    def get_result(filename):
        # 用户名
        username    = 'xxxxxxx'
        # 密码
        password    = 'xxxxxxx'
        # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
        appid       = 1
        # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
        appkey      = '22cc5376925e9387a23cf797cb9ba745'
        # 图片文件
        filename    = filename
        # 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
        codetype    = 5000
        # 超时时间,秒
        timeout     = 60
        # 检查
        if (username == 'username'):
            print('请设置好相关参数再测试')
        else:
            # 初始化
            yundama = YDMHttp(username, password, appid, appkey)
    
            # 登陆云打码
            uid = yundama.login()
            # 查询余额
            balance = yundama.balance()
            # 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
            cid, result = yundama.decode(filename, codetype, timeout)
    
            return  result
    
  • 在使用的时候直接调用即可

2. 示例

'''
以云打码为例,识别其登录验证码
'''

from fake_useragent import UserAgent

from ydmapi import * # 刚才修改的API

def get_cap():
    headers = {'User-Agent':UserAgent().random}
    url = "http://www.yundama.com/index/captcha"

    html = requests.get(url=url, headers=headers).content

    with open('demo.png', "wb") as f:
        f.write(html)

if __name__ == '__main__':
    get_cap()
    result = get_result("demo.png")
    print(result)
chancey@PythonServer:~/project/spider$ ls
00-test_ydm.py  01-ydm-yzm.py  02-ydm-yzm.py  demo.png  __pycache__  ydmapi.py
chancey@PythonServer:~/project/spider$ python3 02-ydm-yzm.py 
EGIV # 识别数来的EGIV

验证码

posted @ 2019-09-24 18:49  ChanceySolo  阅读(214)  评论(0编辑  收藏  举报