自动化验证码破解:Python与OCR库的完美结合

点击名片关注 阿尘blog,一起学习,一起成长

本文主要简单讲解通过playwright与ddddocr结合来解决自动化需要验证的一些方法,主要包括普通验证码、滑动验证。

1、ddddocr

ddddocr的特点主要包括:

  1. 高准确率:利用深度学习技术,特别是卷积神经网络和循环神经网络,对双重数字进行准确的识别。通过深度学习的方法,ddddocr在双重数字识别任务上能够取得较高的准确率。

  2. 开源项目:这是一个开源项目,允许用户免费使用、修改和分发代码。这使得更多的开发者可以参与其中,贡献自己的想法和改进。

  3. 灵活性:用户可以根据自己的需求自定义模型并进行训练,以适应不同的双重数字识别任务。

  4. 全面覆盖:作为一款全面覆盖的OCR识别工具,则在识别能力方面表现出了非常出色的性能。在识别中文方面,ddddocr能够准确识别包括繁体字在内各种中文汉字,甚至还支持一些生僻字的识别。而在识别英文时,则能够准确辨别各种大小写字母、数字、基本符号等英文字符。此外,ddddocr还支持各种印刷体和手写体的识别,可以满足不同用户的多种识别需求。

  5. 优秀的使用体验:用户只需要选择需要识别的文件,并点击一键识别,即可非常方便地完成整个识别流程。此外,ddddocr还支持多种语言的识别,用户可以根据自己的使用需求选择适合的语言进行识别。

ddddocr的使用教程

图片:

ede8ba04d5c48b95d753a587a85eeb43.png

安装

pip install ddddocr

使用ddddocr识别验证码图片示例

import ddddocr
ocr = ddddocr.DdddOcr()
with open('img.png','rb') as img:
    img_bytes = img.read()
res = ocr.classification(img_bytes)
print(res)

85851d4c266f91ddf3501c6c1386181c.png

使用总结:相当简单,相当精准,优先推荐!!!

这里有广告,可以在实例化传入参数show_ad=False,就没有广告了

2、playwright截取验证码并识别实现登录

开始录制脚本获取元素定位

python -m playwright codegen -o "D:\PythonProject\OCR-project\qb5.py"

录制完成后手动编辑修改一下

from playwright.sync_api import Playwright, sync_playwright, expect
import ddddocr
import time
# 定义识别验证码的方法
def checkcode(path):
    ocr = ddddocr.DdddOcr(show_ad=False)
    with open(path,'rb') as img:
        img_bytes = img.read()
    res = ocr.classification(img_bytes)
    return res
# 登录
def login_by_checkcode(playwright):
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://example.com")
    page.locator("#username").fill("your username")
    page.locator("#password").fill("your password")
    # 通过元素截屏
    element_handle = page.get_by_role("img")
    element_handle.screenshot(path='screenshot.png')
    # 调用函数,获取验证码
    check_code = checkcode(path='screenshot.png')
    print(check_code)
    page.locator("input[name=\"checkcode\"]").fill(check_code)
    page.get_by_role("checkbox").uncheck()
    page.get_by_role("button", name="立即登录").click()
    time.sleep(5)
    context.close()
    browser.close()
    
with sync_playwright() as playwright:
    login_by_checkcode(playwright)

3、playwright实现滑动验证登录

测试网站:https://www.geetest.com/adaptive-captcha-demo

开始录制脚本

python38 -m playwright codegen -o "D:\PythonProject\OCR-project\ocr_slide.py"
# coding:utf-8
# @author:Achen_blog
import requests
from playwright.sync_api import Playwright, sync_playwright, expect
import re
import ddddocr
import time
import requests
from lxml import etree
# 通过ddddocr获取需要滑动的的位移
def get_xy():
    det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)

    with open('slice.png', 'rb') as f:
        target_bytes = f.read()

        f.close()
    with open('background.png', 'rb') as f:
        background_bytes = f.read()

        f.close()
    try:
        res = det.slide_match(target_bytes, background_bytes,simple_target=True)
        print(res)
        return res.get('target')[0]
    except:
        return False

def slide_ocr(playwright):
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    # 需要设置网页视图大小
    page = context.new_page()
    page.goto("https://www.geetest.com/adaptive-captcha-demo")
    page.locator("div").filter(has_text=re.compile(r"^滑动拼图验证$")).click()
    page.get_by_label("点击按钮开始验证").click()
    # 获取滑动图片
    time.sleep(3)
    lxml = page.content() # 由于获取滑动图片元素定位复杂,这里改用lxmlxpath定位
    html = etree.HTML(lxml)
    # time.sleep(10)
    slice_link = html.xpath('//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[1]/div[1]/@style')[0]  #这里的属性是列表
    # print(slice_link)
    slice_link = str(slice_link) #必须将获得属性值转为str,不然不能直接切割
    slice_url = slice_link.split('"')[1]
    print(slice_url)
    with open('slice.png','wb') as slice1:
        pic1 = requests.get(slice_url).content
        time.sleep(1)
        slice1.write(pic1)
        slice1.close()
    # 获取背景图片
    # time.sleep(2)
    bg_url = html.xpath('//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[2]/@style')[0]
    bg_url = str(bg_url)
    bg_url = bg_url.split('"')[1]
    print(bg_url)
    with open('background.png','wb') as bg1:
        pic2 = requests.get(bg_url).content
        time.sleep(1)
        bg1.write(pic2)
        bg1.close()
    
    # 调用获取滑动位移的函数
    target = get_xy()
    # 如果target返回true,则通过鼠标移动滑块
    print(target)
    if target:
        print(target)
        class1 = html.xpath('//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[1]/div[1]/@class')[0]
        class1 = str(class1)
        str1 = class1.split(' ')[0].split('_')[0]
        str2 = class1.split(' ')[0].split('_')[1]
        str3 = class1.split(' ')[0].split('_')[3]
        clastr ='.' + str1 + '_' + str2+ '_' +str3
        x0 = page.locator(clastr).bounding_box()['x']
        y0 = page.locator(clastr).bounding_box()['y']
        x = x0 + target +2  # 坐标需自己进行微调
        y = y0
        page.locator(clastr).hover()#鼠标悬停
        page.mouse.down()# 鼠标落下
        page.mouse.move(x,y) #鼠标移动
        page.mouse.up() #松开鼠标
        time.sleep(1)
        try:
            pas_text = html.xpath('//*[@id="captcha"]/div[2]/div[1]/div[3]/div[2]/div/div[2]/text()')

            if pas_text == '验证通过':
                print('验证成功!')
            else:
                print('验证失败')
        except:
            print('验证失败')
    # page.locator("div").filter(has_text=re.compile(r"^验证失败 请重新尝试$")).nth(1).click()
    # page.locator().bounding_box()
    # ---------------------
    context.close()
    browser.close()


with sync_playwright() as playwright:
    slide_ocr(playwright)

playwright的xpath绝对定位不好用,特别是包含角标的会失效,不建议使用下标

当面临必须要用绝对xpath而且有下表如div[2]等情况才能定位,那么建议转为lxml的xpath定位

工具没有完美的,playwright需要不断改进,但我们使用可以结合不同工具,比如定位这里可以用pyppteer

好了本次分享就到这,历经了点波折,还是不够完美,但是验证码识别思路已经搞定!

参考文章:https://blog.csdn.net/weixin_61736939/article/details/130048614

扫描二维码关注阿尘blog,一起交流学习

自动化验证码破解:Python与OCR库的完美结合_第1张图片

你可能感兴趣的:(自动化,python,ocr,运维,开发语言)