验证码识别

点触验证码识别#

爬虫遇到最多的就是验证码,验证码也是当前最为有效的反爬措施,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

验证码

作者:ChanceySolo

出处:https://www.cnblogs.com/chancey/p/11580166.html

版权:本作品采用「ChanceySolo-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   ChanceySolo  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示