很多网站都是用得滑块验证码!Python搞定99%的网站!

python-selenium模拟登陆(滑动验证码) python-selenium模拟登陆(滑动验证码) 普通滑动验证码验证 只需要我们将滑块拖动指定位置,处理起来比较简单。拖动之前需要先将滚动条滚动到指定元素位置,但是需要注意目标网站对selenium的反爬,如window.navigator.webdriver识别;滑块移动速度识别等; 带缺口(拼图)滑动验证码 这一类验证码可以使用两种方式识别: ①在目标网站带有完整背景图时,可以获取完整背景图与带缺口的图片进行比较,获取缺口的位置,计算距离,拖动滑块移动至缺口即可; ②尝试先用cv2的边缘检测识别出 阅读详情

普通滑动验证码验证

只需要我们将滑块拖动指定位置,处理起来比较简单。拖动之前需要先将滚动条滚动到指定元素位置,但是需要注意目标网站对selenium的反爬,如window.navigator.webdriver识别;滑块移动速度识别等;
在这里插入图片描述

带缺口(拼图)滑动验证码

这一类验证码可以使用两种方式识别:
①在目标网站带有完整背景图时,可以获取完整背景图与带缺口的图片进行比较,获取缺口的位置,计算距离,拖动滑块移动至缺口即可;
②尝试先用cv2的边缘检测识别出边界,然后进行模糊匹配,匹配出拼图在验证码图片的位置。

边缘检测

v2模块提供了多种边缘检测算子,包括Sobel、Scharr、Laplacian、prewitt、Canny或Marr—Hildreth等,每种算子得出的结果不同。这里我们用Canny算子,测试了很多算子,这种效果最好。
在这里插入图片描述

调整一下canny算子的阈值,使得输出图片只包含拼图轮廓

import cv2

lowThreshold = 0
maxThreshold = 100

# 最小阈值范围 0 ~ 500
# 最大阈值范围 100 ~ 1000

def canny_low_threshold(intial):
    blur = cv2.GaussianBlur(img, (3, 3), 0)
    canny = cv2.Canny(blur, intial, maxThreshold)
    cv2.imshow('canny', canny)


def canny_max_threshold(intial):
    blur = cv2.GaussianBlur(img, (3, 3), 0)
    canny = cv2.Canny(blur, lowThreshold, intial)
    cv2.imshow('canny', canny)


# 参数0以灰度方式读取
img = cv2.imread('vcode.png', 0)

cv2.namedWindow('canny', cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.createTrackbar('Min threshold', 'canny', lowThreshold, max_lowThreshold, canny_low_threshold)
cv2.createTrackbar('Max threshold', 'canny', maxThreshold, max_maxThreshold, canny_max_threshold)
canny_low_threshold(0)

# esc键退出
if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()
12345678910111213141516171819202122232425262728293031

在对目标网站进行测试后发现最小阈值100、最大阈值500输出结果比较理想

模糊匹配

我们用cv2的matchTemplate方法进行模糊匹配,匹配方法用CV_TM_CCOEFF_NORMED归一化相关系数匹配。

几种方法算法详见。
【1】 平方差匹配 method=CV_TM_SQDIFF square dirrerence(error)
这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.
【2】标准平方差匹配 method=CV_TM_SQDIFF_NORMED standard square dirrerence(error)
【3】 相关匹配 method=CV_TM_CCORR
这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.
【4】 标准相关匹配 method=CV_TM_CCORR_NORMED
【5】 相关匹配 method=CV_TM_CCOEFF
这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,
-1表示糟糕的匹配,0表示没有任何相关性(随机序列).
【6】标准相关匹配 method=CV_TM_CCOEFF_NORMED

import cv2
import numpy as np

def matchImg(imgPath1,imgPath2):

    imgs = []

    # 原始图像,用于展示
    sou_img1 = cv2.imread(imgPath1)
    sou_img2 = cv2.imread(imgPath2)

    # 原始图像,灰度
    # 最小阈值100,最大阈值500
    img1 = cv2.imread(imgPath1, 0)
    blur1 = cv2.GaussianBlur(img1, (3, 3), 0)
    canny1 = cv2.Canny(blur1, 100, 500)
    cv2.imwrite('temp1.png', canny1)

    img2 = cv2.imread(imgPath2, 0)
    blur2 = cv2.GaussianBlur(img2, (3, 3), 0)
    canny2 = cv2.Canny(blur2, 100, 500)
    cv2.imwrite('temp2.png', canny2)

    target = cv2.imread('temp1.png')
    template = cv2.imread('temp2.png')

    # 调整显示大小
    target_temp = cv2.resize(sou_img1, (350, 200))
    target_temp = cv2.copyMakeBorder(target_temp, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[255, 255, 255])

    template_temp = cv2.resize(sou_img2, (200, 200))
    template_temp = cv2.copyMakeBorder(template_temp, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[255, 255, 255])

    imgs.append(target_temp)
    imgs.append(template_temp)

    theight, twidth = template.shape[:2]

    # 匹配拼图
    result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)

    # 归一化
    cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1 )

    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

    # 匹配后结果画圈
    cv2.rectangle(target,max_loc,(max_loc[0]+twidth,max_loc[1]+theight),(0,0,255),2)


    target_temp_n = cv2.resize(target, (350, 200))
    target_temp_n = cv2.copyMakeBorder(target_temp_n, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[255, 255, 255])

    imgs.append(target_temp_n)

    imstack = np.hstack(imgs)

    cv2.imshow('stack'+str(max_loc), imstack)

    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    return max_loc[0]
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263

完整程序

完整流程1.实例化浏览器 2.点击登陆,弹出滑动验证框 3.分别新建标签页打开背景图及拼图 4.全屏截图后按照尺寸裁剪 5.模糊匹配两张图片,获取匹配结果位置信息 6.将位置信息转为页面上的位移距离 7.拖动滑块到指定位置

# -*- coding: utf-8 -*-
"""
@Time : 2021/2/21 10:45
@Auth : ZBX_LOFM
@File :Sign_in1.py
@IDE :PyCharm
@Motto:ABC(Always Be Coding)
"""
import time
import cv2
import canndy_test
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver import ChromeOptions
'''
滑动验证码识别
'''

def isEleExist(browser,id):
    try:
        browser.find_element_by_id(id)
        return True
    except:
        return False


def login():

    driver_path = "C:/Users/61608/Desktop/sign/driver/chromedriver.exe"  #浏览器驱动路径
    option = ChromeOptions()
    option.add_argument('--headless')                                    #无头模式,分辨率相当于1600*900的显示屏
    browser = webdriver.Chrome(options=option, executable_path=driver_path)

    # 登录页面
    url = r'https://dnf.gamebbs.qq.com/plugin.php?id=k_misign:sign'
    # 访问登录页面
    browser.get(url)
    # 隐式等待,让js脚本加载完毕
    browser.implicitly_wait(10)

    #先转到frame窗口
    browser.switch_to.frame('ui_ptlogin')
    browser.find_element_by_id('switcher_plogin').click()
    browser.implicitly_wait(1)
    #用户名
    browser.find_element_by_id('u').send_keys('')
    #密码
    browser.find_element_by_id('p').send_keys('')
    time.sleep(1)
    browser.find_element_by_id('login_button').click()
    browser.implicitly_wait(1)
    # 获取iframe元素,切到另一个iframe
    frame = browser.find_element_by_id('tcaptcha_iframe')
    browser.switch_to.frame(frame)

    time.sleep(1)

    # 获取背景图src
    targetUrl = browser.find_element_by_id('slideBg').get_attribute('src')

    # 获取拼图src
    tempUrl = browser.find_element_by_id('slideBlock').get_attribute('src')
    # 新建标签页
    browser.execute_script("window.open('');")
    # 切换到新标签页
    browser.switch_to.window(browser.window_handles[1])
    # 访问背景图src
    browser.get(targetUrl)
    time.sleep(3)
    # 截图
    browser.save_screenshot('image/temp_target.png')
    w = 680
    h = 390

    img = cv2.imread('image/temp_target.png')

    size = img.shape

    top = int((size[0] - h) / 2)
    height = int(h + ((size[0] - h) / 2))
    left = int((size[1] - w) / 2)
    width = int(w + ((size[1] - w) / 2))

    cropped = img[top:height, left:width]

    # 裁剪尺寸
    cv2.imwrite('image/temp_target_crop.png', cropped)

    # 新建标签页
    browser.execute_script("window.open('');")

    browser.switch_to.window(browser.window_handles[2])

    browser.get(tempUrl)

    time.sleep(3)

    browser.save_screenshot('image/temp_temp.png')

    w = 136
    h = 136

    img = cv2.imread('image/temp_temp.png')

    size = img.shape

    top = int((size[0] - h) / 2)
    height = int(h + ((size[0] - h) / 2))
    left = int((size[1] - w) / 2)
    width = int(w + ((size[1] - w) / 2))

    cropped = img[top:height, left:width]

    cv2.imwrite('image/temp_temp_crop.png', cropped)

    windows = browser.window_handles
    browser.switch_to.window(windows[0])

    # 模糊匹配两张图片
    move = canndy_test.matchImg('image/temp_target_crop.png', 'image/temp_temp_crop.png')
    # 计算出拖动距离,需要根据实际图片进行计算
    distance = int(move / 2 -  65.5) + 2

    browser.switch_to.frame('ui_ptlogin')
    browser.switch_to.frame('tcaptcha_iframe')
    draggable = browser.find_element_by_id('tcaptcha_drag_thumb')
    ActionChains(browser).click_and_hold(draggable).perform()

    # 拖动
    ActionChains(browser).move_by_offset(xoffset=distance, yoffset=0).perform()
    ActionChains(browser).release().perform()
    browser.quit()
    time.sleep(10)

    if (isEleExist(browser, 'slideBg')):
        print('登录失败')
    else:
        print('登录成功')

if __name__ =="__main__":
    login()

 
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143

经测试后发现准确率并不是很高(受网络问题,拼图丢失等影响较大),并不建议使用于生产环境;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可能会存在第一次不成功的情况,虽然拖动到了指定位置但是提示网络有问题、拼图丢失。有些网站在不成功情况下拼图会刷新,可以进行循环迭代直到拼成功为止;有些网站失败不会刷新拼图需要重新跑程序;

近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地


 

 

用selenium解决滑块验证码 主要是用selenium技术破解极验的滑块验证码的个别案列。用selenium打开浏览器指定网站将残缺块图片和背景图片下载到本地对比两张图片的相似地方,计算要滑动的距离规划路线,移动滑块。 阅读详情

相关推荐

selenium+opencv实现模拟登陆(滑块验证码)

很多网站登录登陆时都要用到滑块验证码,在某些场景例如使用爬虫爬取信息时常常受到阻碍,想着用opencv的模板匹配试试能不能实现模拟登陆。

qq_46145027的博客 3501

Selenium实现滑动滑块验证码验证

登录豆瓣。

weixin_53300120的博客 8556

Python Selenium自动化验证码识别实战:从OCR到行为模拟的完整解决方案

验证码作为人机交互的核心验证机制,其本质是通过图像、逻辑或行为挑战来区分人类用户与自动化程序。其技术原理涵盖图像处理、模式识别和行为分析,旨在防止恶意爬虫和自动化攻击。在自动化测试、数据采集和RPA流程中,高效处理验证码是实现流程自动化的关键技术价值所在。应用场景广泛,从网站登录、数据提交到批量操作均需应对。针对字符型验证码,可通过图像预处理结合OCR库(如Tesseract、ddddocr)进行本地识别;对于复杂的滑块、点选等行为验证码,则需采用图像模板匹配、轨迹模拟算法或集成第三方打码平台API。本文以

weixin_34242509的博客 294

使用selenium解决滑块验证的问题

使用自动化测试时有些网站会使用滑块来阻止,所以如何解决滑块问题已经成为自动化测试不可或缺的,今天以网易易盾网站的滑块举例:https://dun.163.com/trial/sense

ljf520lhy的博客 8639

Python Selenium+OpenCV模拟真人滑动验证码破解实战教程

滑动验证码是一种常见的人机验证机制,其核心原理是通过分析用户鼠标移动轨迹的行为特征来区分人类与机器操作。传统的自动化脚本因轨迹过于规律而容易被识别拦截。在技术实现上,通常需要结合图像处理技术定位缺口,并模拟人类拖拽的加速度变化曲线。其技术价值在于能够有效提升自动化测试、数据采集等场景的通过率与稳定性。应用场景广泛涉及网络爬虫、自动化测试及需要绕过验证的合法业务流程自动化。本文基于Selenium与OpenCV技术栈,详细解析了如何通过模板匹配精准计算滑动距离,并设计拟人化的轨迹算法来模拟加速、减速、随机停顿

weixin_27215337的博客 353

DN验证码逆向实战:图像处理与参数破解全流程解析

验证码作为网络安全的基础防线,其核心原理是通过人机交互差异来抵御自动化攻击。常见的图形验证码通过引入干扰线、噪声和动态混淆等技术,增加机器识别的难度。从技术价值看,逆向分析验证码不仅有助于理解其防御机制,更能提升自动化测试和数据采集的工程效率。在应用场景上,电商、社交平台及各类数据接口常采用此类验证码进行防护。本文聚焦于一种典型的DN验证码,它结合了动态干扰线和参数混淆。通过OpenCV进行图像预处理,利用边缘检测和模板匹配算法定位缺口,并深入逆向JavaScript逻辑破解关键的dn参数,最终实现稳定识别

weixin_33754065的博客 280

顶象滑块验证码逆向:从乱序背景图还原到自动化识别全流程

滑块验证码是Web安全中常见的人机验证机制,其核心原理是通过前端技术(如Canvas)对验证元素进行动态干扰,以抵御自动化程序的识别。理解其背后的JavaScript执行逻辑和图像处理流程,对于爬虫工程师和安全研究人员而言,是突破自动化瓶颈的关键技术。通过动态调试和代码逆向,可以定位到核心的乱序索引生成算法,该算法通常基于图片URL或特定参数生成一个唯一的排列序列,用于在前端对背景图片进行切割和重排。掌握这一原理后,便能在本地或服务端使用Python等语言复现还原算法,将打乱的图片拼回原样,从而为后续的图像

weixin_34117211的博客 409

AI辅助Python爬虫实战:SeepSeek高效采集京东商品数据

网络爬虫是自动化获取网页数据的关键技术,其核心原理是通过模拟浏览器请求与解析HTML文档来提取结构化信息。在Python生态中,requests、BeautifulSoup等库构成了静态爬虫的基础,而Selenium、Playwright则用于应对动态渲染页面。这项技术的价值在于能将海量、分散的公开网络信息转化为可分析的结构化数据,广泛应用于市场分析、竞品调研和价格监控等场景。针对京东等大型电商平台,数据采集常面临反爬机制、动态加载等挑战。本文以京东商品数据采集为例,详细展示了如何利用AI编程助手SeepS

weixin_34236869的博客 508

Python自动化验证码识别:ddddocr库实战指南与优化技巧

验证码识别是自动化测试、数据采集和流程自动化中的关键技术挑战。其核心原理是通过计算机视觉技术,将图像中的字符或图形信息转换为机器可读的文本或坐标数据。传统方法依赖图像处理和模板匹配,而现代方案则广泛采用深度学习模型,在泛化能力和准确率上实现了显著提升。ddddocr作为一个开源的Python OCR库,凭借其离线可用、泛化能力强和API简洁的特点,为开发者提供了高效的验证码识别解决方案。它支持字符识别、滑块匹配和目标检测等多种验证码类型,并能通过预处理、参数调优和错误重试等工程实践,有效应对复杂验证码场景,

475

3行代码搞定滑块验证码!ddddocr+Python实战,告别打码平台(附95%通过率优化指南)

所谓“3行代码搞定滑块”,是一个正确的起点,但不是一个完整的终点。知道这3行代码什么时候会失效,以及失效之后该怎么办。预处理、重试策略、轨迹模拟、降级链路——这些“不性感”的工作,才是把demo变成生产系统的分水岭。ddddocr的价值不在于它有多强,而在于它把滑块识别的门槛降到了“个人开发者可承受”的范围。在这个基础上叠加工程优化,你就能以接近零成本解决大部分验证码问题。省下来的打码费用,够你买好几台服务器了。参考资源ddddocr GitHub仓库及官方文档《Web验证码攻防技术演进》

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 814

某巢登录滑块逆向--python还原

对滑动轨迹以及轨迹加密进行python还原,最终通过滑块验证码校验

weixin_66580433的博客 1905

验证码识别工具选型深度对比:Tesseract、云服务、AI模型,到底哪个更适合你?

Tesseract不要死磕预处理很多新人拿到Tesseract,准确率低就一个劲调二值化阈值、换去噪算法,折腾半天提升几个点。其实这是技术路线的天花板,再调也没用。准确率不够就直接换深度学习方案,别在错误的方向上努力。云服务不要只看标价大厂OCR经常标着"免费额度",但超出后的阶梯定价并不便宜。而且很多人忽略了:通用OCR对验证码的识别率其实没那么高,失败重试也是成本。算下来不一定比专业打码平台划算。ddddocr要加置信度判断不要识别出什么就信什么。ddddocr虽然准确率高,但也会有识别错的时候。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1669

Python 爬虫实战:反爬终极解决方案(应对99%的网站)

滑块验证/点选验证:用「ddddocr、百度AI、阿里云」等第三方OCR平台自动识别,准确率95%+;谷歌reCAPTCHA验证:用付费的打码平台(如云码、打码兔)自动过验证,成本低,效率高;核心原则:验证码是最后一道防线,能绕过就绕过(比如模拟真人行为避免触发验证码),绕不过就用工具识别。Python爬虫的反爬攻防,本质是一场「猫鼠游戏」,但99%的网站都有对应的破解方案。懂原理:知道网站为什么封你,知道反爬的底层逻辑,才能对症下药;极致的伪装。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1985

Uibot客户数据迁移实战:验证码容错与多源清洗

RPA(机器人流程自动化)是一种通过软件机器人模拟人工操作、自动执行规则化业务流程的技术。其核心原理在于跨系统交互、结构化解析与异常可控的闭环执行。在企业数字化升级中,RPA的技术价值突出体现在低成本、零代码对接 legacy 系统,尤其适用于客户数据迁移这类高重复、多格式、强校验的典型场景。实际落地时,关键挑战往往不在流程搭建,而在验证码容错、非结构化PDF抽取、Excel脏数据清洗等细节问题。本文基于Uibot流程创造者平台,以真实32万条客户数据迁移项目为蓝本,详解如何用图像比对替代OCR实现99.2

weixin_33863087的博客 353

Python反爬虫攻防实战:从入门到封神,搞定99%网站反爬机制(附避坑+实战代码+行业黑话)

基础层:做好请求头伪装、IP代理池、Cookie池、随机延迟,能搞定90%中小型网站;进阶层:掌握JS逆向、验证码识别、字体反爬,能搞定淘宝、京东等专业级网站;高级层:掌握浏览器指纹伪造、行为模式模拟,能搞定顶级反爬网站;工程化:搭建分布式爬虫架构,实现高并发、高可用爬取;合规性:遵守法律法规,避免法律风险。反爬虫攻防是一场猫鼠游戏,没有一劳永逸的方案,需要持续学习、持续优化。但只要掌握了本文的核心思路,就能搞定99%的网站反爬机制,从爬虫新手变成反爬攻防高手。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1402

Python+CV全类型验证码一站式破解

这套Python+CV 一站式方案可以破解:✅ 滑块验证码 ✅ 文字点选 ✅ 纯文字 ✅ 图标点选本地免费、无延迟、准确率高,完全替代付费打码平台,是爬虫必备工具!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 208

2026年Python爬虫还能这么玩?从Requests到AI Agent,我整理了这份技术全景图

从2020年的Requests+Selenium,到2026年的大模型+AI Agent,Python爬虫技术一直在演进,但核心从来没变过——用技术解决实际问题,合法合规地爬取数据。Requests、Scrapy这些“老技术”不会过时,AI Agent这些“新技术”也不是万能的——关键是要根据场景选择合适的技术,分层架构,混合使用,才能效率最高,成本最低。如果你也在做Python爬虫,不妨试试“规则+大模型”的混合架构,或者玩一玩AI Agent——你会发现,原来爬虫还能这么写。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1371

matlab/simulink saw谐振器仿真,基于Matlab的SAW模态耦合模型的仿真研究

第32卷 第 4 期Vol. 32 No. 4重 庆 理 工 大 学 学 报 (自然科学)Journal of Chongqing University of Technology( Natural Science)2 0 1 8年 4 月Apr. 2018doi : 10.3969/j . issn. 1674-8425(z). 2018.04.002本文引用格式 :李志鹏,马龙祥,孟旭,等•基...

weixin_36192634的博客 1385
上一篇: python爬取分析超级大乐透历史开奖数据!你中奖了吗?
下一篇: 利用Python在互动吧网站自动抢票实战分析!你学废了吗
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值