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

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


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

1、ddddocr

ddddocr的特点主要包括:

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

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

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

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

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

ddddocr的使用教程

图片:

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

安装

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)

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

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

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

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

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

 python -m playwright codegen -o "D:PythonProjectOCR-projectqb5.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:PythonProjectOCR-projectocr_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,一起交流学习






原文始发于微信公众号(阿尘blog):自动化验证码破解:Python与OCR库的完美结合

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/188349.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!