当前位置: 首页 > article >正文

【深度破解】爬虫反反爬核心技术实践:验证码识别与指纹伪装

一、反爬技术体系全景图

现代Web应用的常见反爬手段:

mermaid:

graph TDA[反爬体系] --> B[行为特征检测]A --> C[验证码体系]A --> D[指纹追踪]B --> B1[请求频率]B --> B2[鼠标轨迹]B --> B3[页面停留时间]C --> C1[图形验证码]C --> C2[滑动拼图]C --> C3[点选文字]D --> D1[浏览器指纹]D --> D2[设备指纹]D --> D3[IP信誉库]

二、验证码破解方案

2.1 验证码类型与应对策略

验证码类型破解方案工具推荐
传统字符验证码OCR识别 + 降噪处理Tesseract/PaddleOCR
滑动拼图轨迹模拟 + 缺口识别OpenCV/深度学习模型
点选文字文字识别 + 坐标计算YOLOv5/PP-OCRv3
智能验证(极验等)绕过方案 + 第三方打码平台2Captcha/DeathByCaptcha

2.2 自动化验证码处理框架

class CaptchaSolver:def __init__(self, api_key):self.api_key = api_key  # 打码平台密钥def solve_image_captcha(self, image_path):# 使用本地模型识别try:from paddleocr import PaddleOCRocr = PaddleOCR(use_angle_cls=True)result = ocr.ocr(image_path, cls=True)return result[0][1][0]except:# 降级到第三方APIreturn self._use_thirdparty_api(image_path)def _use_thirdparty_api(self, image_path):import requestsfiles = {'file': open(image_path, 'rb')}resp = requests.post(f'http://2captcha.com/in.php?key={self.api_key}',files=files)if resp.ok:captcha_id = resp.text.split('|')[1]# 轮询获取结果for _ in range(10):result = requests.get(f'http://2captcha.com/res.php?key={self.api_key}&action=get&id={captcha_id}').textif 'OK' in result:return result.split('|')[1]return None# 使用示例
solver = CaptchaSolver('YOUR_API_KEY')
captcha_text = solver.solve_image_captcha('captcha.png')

2.3 滑动验证码破解

def solve_slide_captcha(bg_path, tp_path):import cv2import numpy as np# 读取图片bg = cv2.imread(bg_path)  # 背景图tp = cv2.imread(tp_path)  # 缺口图# 边缘检测bg_edge = cv2.Canny(cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY), 255)tp_edge = cv2.Canny(cv2.cvtColor(tp, cv2.COLOR_BGR2GRAY), 255)# 模板匹配result = cv2.matchTemplate(bg_edge, tp_edge, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)# 计算滑动距离return max_loc[0]

三、指纹伪装核心技术

3.1 浏览器指纹组成要素

pietitle 浏览器指纹构成"User-Agent" : 35"Canvas指纹" : 20"WebGL指纹" : 15"字体列表" : 12"屏幕分辨率" : 10"时区设置" : 8

3.2 指纹伪装实现方案

3.2.1 基础伪装
from fake_useragent import UserAgent
import randomdef get_fake_headers():ua = UserAgent()return {'User-Agent': ua.random,'Accept-Language': 'en-US,en;q=0.9','Sec-Ch-Ua': f'"Not.A/Brand";v="8", "Chromium";v="{random.randint(100, 120)}"','Sec-Ch-Ua-Platform': random.choice(['Windows', 'macOS', 'Linux']),}
3.2.2 高级指纹生成
from selenium.webdriver import ChromeOptionsdef get_stealth_options():options = ChromeOptions()# 禁用WebDriver特征options.add_argument('--disable-blink-features=AutomationControlled')options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option('useAutomationExtension', False)# 修改navigator属性options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...")# 屏幕参数伪装options.add_argument(f"--window-size={random.randint(1200,1400)},{random.randint(800,1000)}")return options

3.3 TLS指纹对抗

# 使用定制化指纹客户端
from curl_cffi.requests import Sessiondef get_tls_fingerprinted_session():session = Session()# 指定特定TLS指纹session.impersonate("chrome110")# 使用示例response = session.get("https://tls.peet.ws/api/all")print(response.json()['tls']['ja3_hash'])

四、高级反检测策略

4.1 流量特征伪装

import time
import randomclass HumanizedRequest:def __init__(self, base_delay=1.0):self.base_delay = base_delaydef get(self, url):# 随机化等待时间delay = self.base_delay * random.uniform(0.8, 1.2)time.sleep(delay)# 添加鼠标移动轨迹self._simulate_mouse_movement()# 发送请求return requests.get(url)def _simulate_mouse_movement(self):# 生成贝塞尔曲线轨迹pass

4.2 浏览器环境模拟

from playwright.sync_api import sync_playwrightdef stealth_browser():with sync_playwright() as p:browser = p.chromium.launch(headless=False)context = browser.new_context(user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',locale='en-US',timezone_id='America/New_York',screen={'width': 1920, 'height': 1080})# 覆盖WebGL指纹context.add_init_script("""WebGLRenderingContext.prototype.getParameter = function(parameter) {if (parameter === 37445) { // UNMASKED_VENDOR_WEBGLreturn 'Google Inc. (NVIDIA)'}return originalGetParameter.call(this, parameter);}""")page = context.new_page()page.goto('https://bot.sannysoft.com')page.screenshot(path='stealth_test.png')

五、防御方案对抗测试

5.1 指纹检测验证

// 常见指纹检测点
const fingerprint = {webgl: WEBGL_INFO,canvas: CANVAS_HASH,fonts: FONT_LIST,audio: AUDIO_CONTEXT_HASH,screen: SCREEN_RESOLUTION,plugins: PLUGINS_LIST
};

5.2 反爬检测工具推荐

  1. Sannysoft检测页面

  2. Pixelscan指纹检测

  3. Creepjs综合检测

六、法律与伦理边界

6.1 合规爬取原则

  1. 严格遵守目标网站robots.txt协议

  2. 控制请求频率(>3秒/请求)

  3. 不绕过付费内容限制

  4. 不进行商业数据盗取

6.2 法律风险警示

  • 违反《数据安全法》第27条

  • 侵犯商业秘密(刑法第219条)

  • 非法侵入计算机系统(刑法第285条)

七、实战推荐工具库

工具类型推荐方案适用场景
验证码识别2Captcha API / ddddocr商业级高精度识别
浏览器自动化Playwright / Puppeteer Extra高级指纹伪装
代理管理ProxyMesh / BrightData住宅IP轮换
指纹生成browser-fingerprint-sdk生成真实浏览器指纹

技术要点总结

  1. 验证码识别需要综合本地模型与第三方服务

  2. 指纹伪装需覆盖浏览器全参数特征

  3. 流量模拟应包含随机化行为模式

  4. 法律合规是技术实施的前提

后续学习建议

  1. 研究WebSocket协议伪装

  2. 探索WebAssembly反调试技术

  3. 学习AST代码混淆方案

  4. 实践分布式验证码破解系统 

相关文章:

【深度破解】爬虫反反爬核心技术实践:验证码识别与指纹伪装

一、反爬技术体系全景图 现代Web应用的常见反爬手段: mermaid: graph TDA[反爬体系] --> B[行为特征检测]A --> C[验证码体系]A --> D[指纹追踪]B --> B1[请求频率]B --> B2[鼠标轨迹]B --> B3[页面停留时间]C --> C1[图形验证码…...

dynamic_cast的理解

dynamic_cast:(具体使用就不详细说明了) C 中用于 安全的类层次结构转换 的类型转换运算符,主要用于 多态类型(即包含虚函数的类)的指针或引用之间的转换 前提条件: 必须要有虚函数才能使用 dy…...

MATLAB 编写的函数或算法生成可供 C++ 调用的库或组件

MATLAB 编写的函数或算法生成可供 C 调用的库或组件 使用 MATLAB Coder 生成 C/C 代码: MATLAB Coder 允许您将 MATLAB 函数转换为可移植的 C 或 C 代码。生成的代码可以作为静态库、动态库或源代码,供 C 项目直接调用。具体步骤包括: 准备…...

Java基础知识-反射

一、什么是反射? Java反射(Reflection)是Java语言的核心特性之一,它允许程序在运行时(Runtime)动态地操作类和对象。通过反射API,我们可以在程序运行期间: 获取任意类的Class对象构…...

【大模型学习】什么是具身智能

目录 一、技术背景与历史发展 二、什么是具身智能? 三、技术要点及具体实现细节 1. 感知技术: 2. 运动控制: 3. 学习机制: 4. 人机交互: 四、架构 五、应用 六、实际应用案例 一、技术背景与历史发展 人工智能的…...

直播预告 | TDgpt 智能体发布 时序数据库 TDengine 3.3.6 发布会即将开启

从海量监控数据,到工业、能源、交通等场景中实时更新的各类传感器数据,时序数据正在以指数级速度增长。而面对如此庞杂的数据,如何快速分析、自动发现问题、精准预测未来,成为企业数字化转型过程中的关键挑战。 TDengine 的答案是…...

服务器硬盘出现故障都有哪些解决方法?

服务器作为核心的硬件设施和互联网中必不可少的网络设备,承载着重要的数据信息和业务应用,但是服务器硬盘也会出现故障的情况,当服务器硬盘发生故障该如何进行解决呢,下面,我们就从以下几个方面进行探讨一下吧&#xf…...

vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu

vscode 通过Remote-ssh插件远程连接服务器报错 could not establish connection to ubuntu,并且出现下面的错误打印: [21:00:57.307] Log Level: 2 [21:00:57.350] SSH Resolver called for "ssh-remoteubuntu", attempt 1 [21:00:57.359] r…...

【JavaScript 简明入门教程】为了Screeps服务的纯JS入门教程

0 前言 0-1 Screeps: World 众所不周知,​Screeps: World是一款面向编程爱好者的开源大型多人在线即时战略(MMORTS)沙盒游戏,其核心机制是通过编写JavaScript代码来控制游戏中的单位(称为“Creep”)&#…...

Prometheus stack命令行接入springboot服务metrics

使用Prometheus Stack监控SpringBoot应用 本文将详细介绍如何使用Prometheus Stack监控SpringBoot应用的metrics。假设你已经安装了Kubernetes集群,并使用Helm安装了Prometheus Stack全家桶。SpringBoot应用已经配置好,暴露了相应的metrics端点。 Sprin…...

Git Bash 设置Notepad++作为默认编辑器

网上搜的时候发现别人搞得有点复杂 (绝对正确的方法)Git Bash 设置Notepad作为默认编辑器_git 通过notpad 编辑器-CSDN博客 最简单的方式就是重新安装git,然后在选择编辑器的时候,勾选notepad即可...

Qt 制作验证码

Qt 制作验证码 #include <QRandomGenerator> #include <QPainterPath> #include <QPainter>// 生成随机数 int r(int a,int b0){return b ? QRandomGenerator::global()->bounded(a, b): QRandomGenerator::global()->bounded(a); }// 生成随机多边形…...

WPF InkCanvas 控件详解

1. InkCanvas 是什么? InkCanvas 是 WPF 提供的一个手写绘图控件,它允许用户使用鼠标、触摸屏或手写笔在界面上进行绘图、标注等操作。 核心特点: ✅ 具备笔迹存储和管理功能。 ✅ 提供 Children 和 Strokes 两个集合,分别用于管理子控件和绘制的笔迹。 ✅ 通过 EditingM…...

【数据结构】二叉树 — 经典OJ面试题剖析!!!

目录 二叉树相关oj题 1. 检查两颗树是否相同 2. 另一棵树的子树 3. 翻转二叉树 4. 判断一颗二叉树是否是平衡二叉树 5. 对称二叉树 6. 二叉树的构建及遍历 7. 二叉树的层序遍历 8. 判断一棵树是不是完全二叉树 9. 二叉树的最近公共祖先 10. 根据前序与中序遍历序列构…...

【MySQL】用户账户、角色、口令、PAM

目录 查看用户账户设置 连接 1.本地连接 2.远程连接 账户 角色 操作用户账户和角色 配置口令和账户有效期限 手工使口令过期 配置口令有效期限 PAM身份验证插件 客户端连接&#xff1a;使用 PAM 账户登录 在连接到MySQL服务器并执行查询时&#xff0c;会验证你的身…...

Linux之 权限提升(Linux Privilege Escalation)

Linux 之权限提升 系统信息 1.获取操作系统信息 2.检查PATH&#xff0c;是否有任何可写的文件夹&#xff1f; 3.检查环境变量&#xff0c;有任何敏感细节吗&#xff1f; 4.使用脚本&#xff08;DirtyCow&#xff1f;&#xff09;搜索内核漏洞 5.检查sudo 版本是否存在漏洞…...

贪心算法经典应用:最优答疑调度策略详解与Python实现

目录 引言&#xff1a;从现实场景到算法设计 一、问题背景与数学建模 1.1 现实场景抽象 1.2 时间线分析 二、贪心策略的数学证明与选择依据 2.1 贪心选择性质 2.2 证明过程 三、算法实现与代码解析 3.1 算法步骤分解 3.2 代码亮点解析 四、测试案例与结果验证 4.1 …...

SpringBoot 3+ Lombok日志框架从logback改为Log4j2

r要将Spring Boot 3项目中的日志框架从Logback切换到Log4j2&#xff0c;并配置按日期滚动文件和控制台输出&#xff0c;请按照以下步骤操作&#xff1a; 步骤 1&#xff1a;排除Logback并添加Log4j2依赖 在pom.xml中修改依赖&#xff1a; <dependencies><!-- 排除默…...

【bug】[42000][1067] Invalid default value for ‘xxx_time‘

MySQL错误解决&#xff1a;Invalid default value for xxx_time’问题分析与修复方案 问题描述 在MySQL数据库操作中&#xff0c;当尝试创建或修改表结构时&#xff0c;可能会遇到以下错误信息&#xff1a; [bug] [42000][1067] Invalid default value for xxx_time这个错误…...

网站安全专栏-------浅谈CC攻击和DDoS攻击的区别

CC攻击和DDoS攻击都是网络攻击的类型&#xff0c;但它们在攻击方式、目标和效果上有所不同。以下是它们之间的一些主要区别&#xff1a; ### 1. 定义 - **DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;**&#xff1a; DDoS攻击是指攻击者通过大量的分布式计算机&#x…...

【Tauri2】002——Cargo.toml和入口文件

目录 前言 正文 toml文件的基础 注释——# Comment 键值对——Key/Value 表——[table] 内联表——Inline Table 数组——Array package和crate Cargo.toml文件 Cargo.toml——dependencies Cargo.toml——lib crate-type main.rs 前言 【Tauri2】001——安装及…...

二叉树相关算法实现:判断子树与单值二叉树

目录 一、判断一棵树是否为另一棵树的子树 &#xff08;一&#xff09;核心思路 &#xff08;二&#xff09;代码实现 &#xff08;三&#xff09;注意要点 二、判断一棵树是否为单值二叉树 &#xff08;一&#xff09;核心思路 &#xff08;二&#xff09;代码实现…...

CSS 美化页面(一)

一、CSS概念 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用于描述 HTML 或 XML&#xff08;如 SVG、XHTML&#xff09;文档 样式 的样式表语言。它控制网页的 外观和布局&#xff0c;包括字体、颜色、间距、背景、动画等视觉效果。 二、CS…...

23种设计模式-组合(Composite)设计模式

组合设计模式 &#x1f6a9;什么是组合设计模式&#xff1f;&#x1f6a9;组合设计模式的特点&#x1f6a9;组合设计模式的结构&#x1f6a9;组合设计模式的优缺点&#x1f6a9;组合设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是组合设计模式…...

LSTM创新点不足?LSTM + Transformer融合模型引领Nature新突破

LSTM创新点不足&#xff1f;LSTM Transformer融合模型引领Nature新突破 2024年LSTM真的没有创新空间了吗&#xff1f; 最新研究表明&#xff0c;通过将LSTM与Transformer巧妙融合&#xff0c;依然能创造出Nature级别的突破性成果。LSTM擅长处理短期时序模式&#xff0c;但在…...

【区块链安全 | 第六篇】NFT概念详解

文章目录 NFTNFT&#xff08;非同质化代币&#xff09;FT&#xff08;可替代代币&#xff09; 以太坊 NFT 标准ERC-721&#xff08;单一资产&#xff09;ERC-1155&#xff08;多资产&#xff09; NFT 市场版税机制NFT 借贷NFT 安全 NFT NFT&#xff08;Non-Fungible Token&…...

React组件简介

组件 在 React 中&#xff0c;组件&#xff08;Component&#xff09; 是 UI 的基本构建块。可以把它理解为一个独立的、可复用的 UI 单元&#xff0c;类似于函数&#xff0c;它接受输入&#xff08;props&#xff09;&#xff0c;然后返回 React 元素来描述 UI。 组件的简单…...

iOS常见网络框架

URLSession、Alamofire 和 Moya 1. URLSession 1.1 核心概念 URLSession 是 Apple 官方提供的网络请求 API&#xff0c;封装在 Foundation 框架中。它支持 HTTP、HTTPS、FTP 等协议&#xff0c;可用于&#xff1a; ​ • 普通网络请求&#xff08;GET/POST&#xff09; ​ …...

蓝桥杯备考---->激光炸弹(二维前缀和)

本题我们可以构造二维矩阵&#xff0c;然后根据题意&#xff0c;枚举所有边长为m的正方形&#xff0c;找到消灭价值最多的炸弹 #include <iostream> using namespace std; const int N 1e4; int a[N][N]; int n,m; int f[N][N]; int main() {cin >> n >> m…...

python笔记之判断月份有多少天

1、通过随机数作为目标月份 import random month random.randint(1,12)2、判断对应的年份是闰年还是平年 因为2月这个特殊月份&#xff0c;闰年有29天&#xff0c;而平年是28天&#xff0c;所以需要判断对应的年份属于闰年还是平年&#xff0c;代码如下 # 判断年份是闰年还…...