15.网络爬虫—selenium验证码破解

news2024/11/5 18:23:56

网络爬虫—selenium验证码破解

  • 一·selenium验证码破解
    • 二·破解平台
      • 打码平台超级鹰文识别
      • 基于人工智能的定制化识别平台 —图灵
    • 三·英文数字验证码破解
      • selenium破解验证码快捷登录古诗文网
    • 四·滑动验证码破解
      • selenium滑动验证码破解网易网盾测试案例
    • 五·总结
    • 六·后记

前言
🏘️🏘️个人简介:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证
📝​📝第一篇文章《1.认识网络爬虫》获得全站热榜第一,python领域热榜第一
🧾 🧾第四篇文章《4.网络爬虫—Post请求(实战演示)》全站热榜第八
🧾 🧾第八篇文章《8.网络爬虫—正则表达式RE实战》全站热榜第十二
🧾 🧾第十篇文章《10.网络爬虫—MongoDB详讲与实战》全站热榜第八,领域热榜第二
🧾 🧾第十三篇文章《13.网络爬虫—多进程详讲(实战演示)》全站热榜第十二
🎁🎁《Python网络爬虫》专栏累计发表十四篇文章,上榜五篇。欢迎免费订阅!欢迎大家一起学习,一起成长!!
💕💕悲索之人烈焰加身,堕落者不可饶恕。永恒燃烧的羽翼,带我脱离凡间的沉沦。

一·selenium验证码破解

🧾 🧾网络爬虫是一种自动化程序,用于从Web页面中提取数据。然而,有些网站为了防止爬虫程序抓取数据,会加入一些验证码,使得程序无法自动化地完成数据采集任务。为了解决这个问题,我们可以使用selenium来破解验证码。

🧾 Selenium是一个开源的自动化测试工具,它可以模拟用户在浏览器中的操作,包括点击、输入等。使用selenium可以模拟用户手动输入验证码,从而实现验证码的破解

二·破解平台

首先我们介绍两个第三方破解平台:
第一款第三方打码平台是 :超级鹰

帮助开发者解决图像验证码的识别问题。它采用了最先进的图像识别技术,可以快速准确地识别各种形式的图像验证码,如数字、字母、中文、滑动拼图

第二款第三方平台是 :图灵

基于人工智能的定制化识别平台 可用于识别包括英数类型,中文类型,滑块类型等验证码,

打码平台超级鹰文识别

  • 超级鹰是一款第三方打码平台,可以帮助开发者解决图像验证码的识别问题。它采用了最先进的图像识别技术,可以快速准确地识别各种形式的图像验证码,如数字、字母、中文、滑动拼图等。
  • 超级鹰提供了简单易用的API接口,开发者只需调用接口即可将验证码提交给超级鹰进行识别,并获得识别结果。此外,超级鹰还提供了多种识别方式,如手动识别、自动识别、多人协作等,可以满足不同的识别需求。
  • 超级鹰的图文识别功能可以识别包含文字图片的验证码,比如滑动拼图验证码。它可以先将验证码图片拆分成多个小块,再对每个小块进行识别,最后将结果合并起来得到整个验证码的识别结果。这种识别方式可以大大提高验证码的识别准确率。

🎯1.首先我们登录注册,方便我们后面使用
在这里插入图片描述
🎯2.选择我们需要的价格体系,待会也会用到
在这里插入图片描述
🎯3.Python语言Demo下载
在这里插入图片描述
🎯4.获取软件Key和软件ID
在这里插入图片描述

在这里插入图片描述

基于人工智能的定制化识别平台 —图灵

🧾 🧾主页如下,包含各种验证码识别
在这里插入图片描述
🧾 识别接口说明
识别接口
在这里插入图片描述

识别请求参数说明
在这里插入图片描述

识别返回结果说明
在这里插入图片描述
python API调用代码

import base64
import json
import requests

# 复制以下代码,只需填入自己的账号密码、待识别的图片路径即可。
# 关于ID:选做识别的模型ID。

def b64_api(username, password, img_path, ID):
    with open(img_path, 'rb') as f:
        b64_data = base64.b64encode(f.read())
    b64 = b64_data.decode()
    data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
    data_json = json.dumps(data)
    result = json.loads(requests.post("http://www.tulingcloud.com/tuling/predict", data=data_json).text)
    return result

if __name__ == "__main__":
    img_path = r"C:/Users/Administrator/Desktop/file.jpg"
    result = b64_api(username="你的账号", password="你的密码", img_path=img_path, ID="你选用的模型ID(8位数字)")
    print(result)

到此为止,我们认识了两种用于破解验证码的平台,我们现在实战操作,方便大家理解学习

三·英文数字验证码破解

selenium破解验证码快捷登录古诗文网

🧾 我们来看一下我们的目标
在这里插入图片描述
🎯1.使用selenium自动化登录目标网站

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service(executable_path='D:\chorm\chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)

url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
driver.get(url)

🎯2.通过行为链,输入账号密码,因为我没有注册,所以随便输入的,不过影响不大,我们需要的是输入正确的验证码。

# 账号输入
driver.find_element(By.ID, 'email').send_keys('xxxxx')
# 密码输入
driver.find_element(By.ID, 'pwd').send_keys('xxxx')

🎯3.然后获取验证码的照片到本地,方便我们待会调用接口来破解。

img_code = driver.find_element(By.ID, 'imgCode')
img_code.screenshot('img.png')  # 保存成图片

在这里插入图片描述

🎯4.调用接口,来破解验证码。

from chaojiying import Chaojiying_Client

chaojiying = Chaojiying_Client('xxxx', 'xxxxx', '924117')  # 用户中心>>软件ID 生成一个替换 96001
image = open('img.png', 'rb')  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
pic_str = (chaojiying.PostPic(image.read(), 1004)['pic_str'])
image.close()

driver.find_element(By.ID, 'code').send_keys(pic_str)

🧾 🧾我们的目标就完成了,是不是很简单,后期把账号密码换成注册过的,就能实现自动登录和验证了

完整代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service(executable_path='D:\chorm\chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)

url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
driver.get(url)

# 账号输入
driver.find_element(By.ID, 'email').send_keys('xxxxx')
# 密码输入
driver.find_element(By.ID, 'pwd').send_keys('xxxx')
# 获取验证码
img_code = driver.find_element(By.ID, 'imgCode')
img_code.screenshot('img.png')  # 保存成图片


from chaojiying import Chaojiying_Client

chaojiying = Chaojiying_Client('*****', '*****', '924117')  # 用户中心>>软件ID 生成一个替换 96001
image = open('img.png', 'rb')  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
pic_str = (chaojiying.PostPic(image.read(), 1004)['pic_str'])
image.close()

driver.find_element(By.ID, 'code').send_keys(pic_str)

input()

四·滑动验证码破解

selenium滑动验证码破解网易网盾测试案例

🧾 我们来看一下我们的目标
在这里插入图片描述
🎯1.思路和破解英数验证码一样,使用selenium自动打开网址,然后通过行为链点击到上图这个页面。

service = Service(executable_path='D:\chorm\chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.set_window_size(1100, 800)  # 将浏览器窗口大小设置为宽1100像素,高800像素。

url = 'https://dun.163.com/trial/sense'
driver.get(url)
print(driver.page_source)
wait = WebDriverWait(driver, 20)  # 等待20秒,有数据就进行操作,没有就报错
wait.until(PE((By.XPATH, '/html/body/main/div[1]/div/div[2]/div[2]/ul/li[2]'))).click()  # 点击可疑用户-滑动拼图

js = f'window.scrollTo(0,{300})'
driver.execute_script(js)  # 将当前页面滚动到垂直方向上300像素的位置。

🎯2.然后我们对出现的验证码进行截图:


# 点击验证码位置,方便弹出验证码图框
wait.until(PE((By.XPATH,
               '/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[1]'))).click()

sleep(3)  # 休眠三秒,方便我们截图,防止验证码出现不及时

# 截图网页
driver.save_screenshot("html.png")

# 剪切滑动部分
img = Image.open("html.png")

# 剪切验证码的位置   图片的左上角和右下角 x和y轴
cropped = img.crop((563, 380, 1012, 608))

# 保存剪切的验证码照片
cropped.save("yzm.png")

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

🎯3.调用ApI接口对截取的验证码进行识别


# api接口

def b64_api(username, password, img_path, ID):  # 账户  密码  照片 ID
    with open(img_path, 'rb') as f:
        b64_data = base64.b64encode(f.read())
    b64 = b64_data.decode()
    data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
    data_json = json.dumps(data)
    result = json.loads(requests.post("http://www.tulingtech.xyz/tuling/predict", data=data_json).text)
    return result

在这里插入图片描述

🎯4.selenium 滑动线性 更加模拟人的行为进行点击

# selenium 滑动线性  更加模拟人去操作
def get_move_track(gap):
    track = []  # 移动轨迹
    current = 0  # 当前位移
    # 减速阈值
    mid = gap * 4 / 5  # 前4/5段加速 后1/5段减速
    t = 0.2  # 计算间隔
    v = 0  # 初速度
    while current < gap:
        if current < mid:
            a = 5  # 加速度为+5
        else:
            a = -5  # 加速度为-5
        v0 = v  # 初速度v0
        v = v0 + a * t  # 当前速度
        move = v0 * t + 1 / 2 * a * t * t  # 移动距离
        current += move  # 当前位移
        track.append(round(move))  # 加入轨迹
    return track

🎯5.讲破解出的数据交给代码,让他帮助我们输入并且通过行为链来拖动滑块填充拼图,完成验证码的验证。


x = int(result['data']['滑块']['X坐标值'])
q = int(result['data']['缺口']['X坐标值'])
ranges = int((q - x) * 0.68)

move_track = get_move_track(ranges)  # 将结果交给滑动线性函数

# 滑动代码

element = wait.until(PE((By.CLASS_NAME, 'yidun_jigsaw')))  # 滑块

ActionChains(driver).click_and_hold(element).perform()  # 通过行为链,按住它,然后执行
for i in move_track:  # 循环每次滑动的距离
    # 执行移动
    ActionChains(driver).move_by_offset(i, 0).perform()
ActionChains(driver).release().perform()  # 松开按键,完成滑动

运行结果:

智能无感知验证码_智能验证码_验证码API_在线体验

完整代码:

import base64
import json
from time import sleep
import requests
from PIL import Image  # pillow
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import presence_of_element_located as PE
from selenium.webdriver.support.ui import WebDriverWait

service = Service(executable_path='D:\chorm\chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.set_window_size(1100, 800)  # 将浏览器窗口大小设置为宽1100像素,高800像素。

url = 'https://dun.163.com/trial/sense'
driver.get(url)
print(driver.page_source)
wait = WebDriverWait(driver, 20)  # 等待20秒,有数据就进行操作,没有就报错
wait.until(PE((By.XPATH, '/html/body/main/div[1]/div/div[2]/div[2]/ul/li[2]'))).click()  # 点击可疑用户-滑动拼图

js = f'window.scrollTo(0,{300})'
driver.execute_script(js)  # 将当前页面滚动到垂直方向上300像素的位置。

# 点击验证码位置,方便弹出验证码图框
wait.until(PE((By.XPATH,
               '/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[1]'))).click()

sleep(3)  # 休眠三秒,方便我们截图,防止验证码出现不及时

# 截图网页
driver.save_screenshot("html.png")

# 剪切滑动部分
img = Image.open("html.png")

# 剪切验证码的位置   图片的左上角和右下角 x和y轴
cropped = img.crop((563, 380, 1012, 608))

# 保存剪切的验证码照片
cropped.save("yzm.png")


# 调用api接口对照片验证码进行识别

def b64_api(username, password, img_path, ID):  # 账户  密码  照片 ID
    with open(img_path, 'rb') as f:
        b64_data = base64.b64encode(f.read())
    b64 = b64_data.decode()
    data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
    data_json = json.dumps(data)
    result = json.loads(requests.post("http://www.tulingtech.xyz/tuling/predict", data=data_json).text)
    return result


# 78915616

result = b64_api('****', '*****', "yzm.png", '78915616')

# 输出滑块和缺口的位置参数
print(result)


# selenium 滑动线性  更加模拟人去操作
def get_move_track(gap):
    track = []  # 移动轨迹
    current = 0  # 当前位移
    # 减速阈值
    mid = gap * 4 / 5  # 前4/5段加速 后1/5段减速
    t = 0.2  # 计算间隔
    v = 0  # 初速度
    while current < gap:
        if current < mid:
            a = 5  # 加速度为+5
        else:
            a = -5  # 加速度为-5
        v0 = v  # 初速度v0
        v = v0 + a * t  # 当前速度
        move = v0 * t + 1 / 2 * a * t * t  # 移动距离
        current += move  # 当前位移
        track.append(round(move))  # 加入轨迹
    return track


x = int(result['data']['滑块']['X坐标值'])
q = int(result['data']['缺口']['X坐标值'])
ranges = int((q - x) * 0.68)

move_track = get_move_track(ranges)  # 将结果交给滑动线性函数

# 滑动代码

element = wait.until(PE((By.CLASS_NAME, 'yidun_jigsaw')))  # 滑块

ActionChains(driver).click_and_hold(element).perform()  # 通过行为链,按住它,然后执行
for i in move_track:  # 循环每次滑动的距离
    # 执行移动
    ActionChains(driver).move_by_offset(i, 0).perform()
ActionChains(driver).release().perform()  # 松开按键,完成滑动

input()

五·总结

📌📌使用selenium破解验证码需要模拟用户操作,包括手动输入验证码和提交表单等。验证码的设计越来越复杂,破解难度也越来越大。因此,在使用selenium破解验证码时,需要根据具体情况选择合适的方法

六·后记

👉👉本专栏所有文章是博主学习笔记,仅供学习使用,爬虫只是一种技术,希望学习过的人能正确使用它。
博主也会定时一周三更爬虫相关技术更大家系统学习,如有问题,可以私信我,没有回,那我可能在上课或者睡觉,写作不易,感谢大家的支持!!🌹🌹🌹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鲁祥老师吉他课学习笔记

鲁祥老师吉他课学习笔记 导语 参考教材&#xff1a; 《吉他入门经典教程》李国标 《弹指之间》潘尚文 《吉他教本》好连得出版社 《吉他教程》杰瑞吉他学校 《伯克利现代吉他教程》 《吉他考级教程》英国RSL其中的原声吉他和电吉他教程 《一个月电吉他新手养成计划》宫胁俊郎 …

C51 - LCD12864

LCD128641> 项目概述2> LCD12864参数2.1> LCD硬件原理框图2.2> 工作原理2.2> 6800接口引脚功能2.3> 6800接口时序3> 硬件设计4> 程序设计4.1> 初始化4.2 > 清屏4.3> 显示ASCII码4.4> 显示图片5> 复盘总结1> 项目概述 51单片机驱动LC…

用不了chatgpt,试试Claude-Claude注册教程

Claude是一款人工智能聊天机器人,由 Anthropic 公司开发。说到Anthropic公司就有意思了&#xff0c;Anthropic成立于2021年&#xff0c;其联合创始人Dario Amodei曾经担任OpenAI 研究副总裁&#xff0c;后来因为对OpenAI变成了CloseAI&#xff0c;心存不满&#xff0c;因此就自…

App 抓包提示网络异常怎么破?

背景 当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的App都提示网络异常/无数据等等信息。以“贝壳找房”为例&#xff1a; Fiddler中看到的请求是这样的&#xff1a; 你可能开始找证书的问题&#xff1a;是…

【MySQL】(2)数据类型

文章目录数据类型分类数值类型文本、二进制类型日期和时间类型String 类型数据类型分类 MySQL 支持多种数据类型&#xff0c;大致可分为数值类型&#xff0c;文本、二进制类型&#xff0c;时间日期&#xff0c;String类型。 数值类型 类型字节有符号范围无符号范围TINYINT1-1…

01 |「ChatGPT」简介

前言 ChatGPT 科普。 文章目录 前言一、ChatGPT 介绍1. ChatGPT 是什么2. ChatGPT 有哪些应用二、相关文献一、ChatGPT 介绍 登录网址:https://chat.openai.com/auth/login 1. ChatGPT 是什么 ChatGPT 是一个大型语言模型,由 OpenAl 公司训练,并基于 GPT-3.5 架构构建;它可…

java设计模式(2)单例模式、工厂模式、原型模式、建造者模式

用pr设计的图片&#xff0c;当封面不错 单例模式 单例对象的类必须保证只有一个实例存在 饿汉式单例 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用&#xff0c;以后不再改变&#xff0c;所以天生是线程安全的 //饿汉式单例类. public class Singleton {//构…

tmall.item.sizemapping.template.create( 新增天猫商品尺码表模板 )

&#xffe5;开放平台免费API必须用户授权 新增天猫商品尺码表模板 男鞋、女鞋、运动鞋、户外鞋类目&#xff0c;尺码表维度为&#xff1a; 脚长&#xff08;cm&#xff09; 必选 内衣-文胸类目&#xff0c;尺码表维度为&#xff1a; 上胸围&#xff08;cm&#xff09; 必选 …

机器学习入门实例-MNIST手写数据集-简单探索二分分类

MNIST数据集介绍 MNIST数据集包含7w张带标签的手写数字图片。每次有新的分类算法出现时&#xff0c;常常会在改数据集测试效果。 from sklearn.datasets import fetch_openml# 获取的mnist是一个字典 mnist fetch_openml(mnist_784, version1) print(mnist.keys()) # dict_k…

Hutool-crypto 加密、解密详解!

1. 介绍 在Java开发的过程中&#xff0c;很多场景下都需要加密解密。 比如对敏感数据的加密&#xff0c;对配置文件信息的加密&#xff0c;通信数据的加密等等。 今天介绍的是Hutool工具包中的加密模块 crypto。 2. 加密分类 加密分为三类&#xff1a; 对称加密&#xff0…

Embarcadero RAD Studio Crack

Embarcadero RAD Studio Crack RAD Studio(r)是一款终极IDE&#xff0c;用于使用Delphi(r)、现代C和适用于Windows 11的高级Windows桌面UI库为多个平台创建单源原生应用程序&#xff0c;它为IDE添加了高DPI支持。这使得开发人员可以在更大的屏幕上以更高的分辨率工作。IDE现在支…

在VS和g++下的string结构的区别

文章目录1. 在VS下的结构2.在gcc下的结构3.写时拷贝/共享内存在之前的时间里&#xff0c;我们学习了string类的使用和模拟实现&#xff0c;但是在VS和g下使用string&#xff0c;发现了一点问题&#xff0c;下面我们通过一段代码来重现一下这个问题#include <iostream> #i…

融合DE 端和FE端数据,利用小波变换生成时频图,再分别利用DCNN、KNN和DNN进行对比实验(python代码)

1.数据集介绍&#xff1a; 试验台如图所示&#xff0c;试验台左侧有电动机&#xff0c;中间有扭矩收集器&#xff0c;右侧有动力测试仪&#xff0c;控制电子设备在图中没有显示。SKF6203轴承使用16通道数据采集卡采集轴承的振动数据&#xff0c;并在驱动端部分&#xff08;DE&…

AI模型训练、实施工程师的职业前景怎么样?

本篇文章主要讲解ai模型训练、模型实施工程师的职业前景和趋势分析 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月18日 ai训练师、模型实施工程师&#xff0c;一般是指opencv、pytorh、python、java、机械学习、深度学习、图像识别、视频检测等领域的模型数据训练工作。 …

07 - 深度学习处理器架构⭐⭐⭐⭐

架构设计需要解决的两个主要问题:(1)如何提高处理器的能效比(性能/功耗)- 硬化算法(2)如何提高处理器的可编程性(通用性) - CPU 一、单核深度学习处理器(DLP-S) 1. 总体架构 (1)架构图 DMA是一种硬件机制,允许外围组件将其I/O数据直接传输到主存储器中,而无需…

CentOS 8 手动安装MongoDB

文章目录1. MongoDB概述2. 安装MongoDB2.1 在MongoDB官网选择对应版本2.2 去到MongoDB安装目录&#xff0c;并下载MongoDB安装包2.3 解压MongoDB安装包2.4 重命名解压后的MongoDB文件夹名2.5 创建MongoDB数据库数据存放路径2.6 创建MongoDB日志文件存放路径2.7 进入MongoDB文件…

Pixhawk基础—认识Pixhawk

Pixhawk简介 pixhawk是由3DR联合APM小组与PX4小组于2014年推出的飞控PX4的升级版&#xff0c;它同时拥有PX4和APM两套固件和相应的地面站软件。该飞控是目前全世界飞控产品中硬件规格最高的产品。 Pixhawk基础 端口介绍 1、Spektrum DSM receiver(Spektrum DSM信号转换为PWM…

Java基础总结(一)

文章目录前言封装继承多态抽象方法接口内部类static权限修饰符this superprivate关键字final关键字就近原则构造方法号StringBuilderStringJoiner字符串原理总结&#xff1a;1、字符串存储的内存原理2、号比较的是什么&#xff1f;3、字符串拼接的底层原理4、StringBuilder提高…

ASIC-WORLD Verilog(1)一日Verilog

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。 这是网站原文&…

Java反射面试总结(二)

为什么引入反射概念&#xff1f;反射机制的应用有哪些&#xff1f; 我们来看一下 Oracle 官方文档中对反射的描述&#xff1a; 从 Oracle 官方文档中可以看出&#xff0c;反射主要应用在以下几方面&#xff1a; 反射让开发人员可以通过外部类的全路径名创建对象&#xff0c;…