DrissionPage 过滑动验证码

首先安装:DrissionPage

pip install DrissionPage

安装ddddocr:

pip install ddddocr

代码示例:

复制代码
from DrissionPage import ChromiumPage,ChromiumOptions
import random
import time
import ddddocr

# 浏览器路径
path = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
co = ChromiumOptions().set_browser_path(path)

# 打开浏览器(全局)
page = ChromiumPage(co)
# 目标网站
page.get("https://cszg.mca.gov.cn/biz/ma/csmh/filter/slideCaptchaindex.html",retry=3,interval=2,timeout=15)

# 滑块的运动轨迹
def get_tracks(distance):
    value = round(random.uniform(0.55,0.78),2)
    v,t,sum1 = 0,0.3,0
    plus = []
    mid = distance * value
    while sum1 < distance:
        if sum1 < mid:
            a = round(random.uniform(2.5,3.5),1)
        else:
            a = -round(random.uniform(2.0,3.0),1)
        s = v * t + 0.5 * a * (t ** 2)
        v = v + a * t
        sum1 += s
        plus.append(round(s))
    return plus


for i in range(5):
    # 获取滑块背景图
    background_bytes = page.ele('xpath://*[@id="oriImg"]').src()
    # 获取缺口图片
    cut_bytes = page.ele('xpath://*[@id="cutImg"]').src()
    # 识别滑块缺口并获得滑动轨迹
    det = ddddocr.DdddOcr(det=False,ocr=False,show_ad=False)
    # 获得滑块距离(通过滑块图片和缺口图片计算出滑块的距离)
    result = det.slide_match(cut_bytes,background_bytes,simple_target=True)
    print("滑块距离:",result)
    # 获得滑块运动轨迹
    offset = result['target'][0]
    tracks = get_tracks(offset)
    print("滑动轨迹:",tracks)
    # 滑动滑块
    # 按动鼠标左键不放
    page.actions.hold('xpath://*[@id="slider"]')
    # 鼠标滑动
    for track in tracks:
        # 使鼠标相对当前位置移动若干距离
        page.actions.move(offset_x=track,offset_y=round(random.uniform(1.0,3.0),1),duration=.1)
    time.sleep(0.1)
    # 释放鼠标左键
    page.actions.release('xpath://*[@id="slider"]')
    # 截图
    page.ele('xpath://*[@id="captchadiv"]').get_screenshot(path='./captcha.jpg')
    time.sleep(5)
    # 如果验证失败
    if '验证' in page.ele('xpath:/html/body/div[6]/div/div[2]').text:
        print('滑动失败,刷新滑块')
        page.ele('xpath://*[@id="captchadiv"]/div[1]/img').click()
    else:
        print("滑动成功")
        break

print('开始采集')
复制代码

 

posted @   离岸少年  阅读(330)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示