本文主要简单讲解通过playwright与ddddocr结合来解决自动化需要验证的一些方法,主要包括普通验证码、滑动验证。
1、ddddocr
ddddocr的特点主要包括:
-
高准确率:利用深度学习技术,特别是卷积神经网络和循环神经网络,对双重数字进行准确的识别。通过深度学习的方法,ddddocr在双重数字识别任务上能够取得较高的准确率。
-
开源项目:这是一个开源项目,允许用户免费使用、修改和分发代码。这使得更多的开发者可以参与其中,贡献自己的想法和改进。
-
灵活性:用户可以根据自己的需求自定义模型并进行训练,以适应不同的双重数字识别任务。
-
全面覆盖:作为一款全面覆盖的OCR识别工具,则在识别能力方面表现出了非常出色的性能。在识别中文方面,ddddocr能够准确识别包括繁体字在内各种中文汉字,甚至还支持一些生僻字的识别。而在识别英文时,则能够准确辨别各种大小写字母、数字、基本符号等英文字符。此外,ddddocr还支持各种印刷体和手写体的识别,可以满足不同用户的多种识别需求。
-
优秀的使用体验:用户只需要选择需要识别的文件,并点击一键识别,即可非常方便地完成整个识别流程。此外,ddddocr还支持多种语言的识别,用户可以根据自己的使用需求选择适合的语言进行识别。
ddddocr的使用教程
图片:
安装
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)
使用总结:相当简单,相当精准,优先推荐!!!
这里有广告,可以在实例化传入参数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