JavaScript反爬技术解析与应对
JavaScript 反爬技术解析与应对
前言
在当今 Web 爬虫与数据抓取的生态环境中,网站运营方日益关注数据安全与隐私保护,因此逐步采用多种反爬技术来限制非授权访问。本文从 JavaScript 角度出发,深入剖析主流反爬策略的技术原理,并探讨相应的绕过方案,以期为研究者和开发者提供系统性的理解与实践指导。
1. JavaScript 反爬技术概述
1.1 右键禁用与开发者工具防护
部分网站采用 JavaScript 拦截用户右键菜单或监听 F12 按键,以阻碍用户直接访问开发者工具。
示例代码:
// 禁用右键菜单
window.addEventListener('contextmenu', event => event.preventDefault());// 监听 F12 及常见开发者工具快捷键
window.addEventListener('keydown', event => {if (event.key === 'F12' || (event.ctrlKey && event.shiftKey && event.key === 'I')) {event.preventDefault();}
});
应对策略:
- 直接在浏览器控制台执行
document.oncontextmenu = null;以解除右键限制。 - 通过修改 JavaScript 代码或使用浏览器扩展禁用前端 JavaScript。
- 在 Puppeteer 环境中执行以下代码,绕过此类限制:
await page.evaluate(() => {document.oncontextmenu = null; });
心得: 这一类简单的反爬手段往往只针对普通用户,而对开发者而言可以轻松绕过,不必理会。
1.2 动态数据加载
许多网站不直接在 HTML 结构中返回完整数据,而是通过 JavaScript 进行异步请求,如 fetch 或 XMLHttpRequest。
示例代码:
fetch('/api/data').then(response => response.json()).then(data => console.log(data));
应对策略:
- 通过浏览器
Network面板定位 API 请求地址,直接使用curl或requests模拟请求。 - 若 API 存在签名验证,可使用 Puppeteer 拦截并复用请求参数:
await page.setRequestInterception(true); page.on('request', request => {console.log(request.url(), request.postData());request.continue(); });
心得: 动态数据加载是现代网站的常见模式,因此在爬取时应优先检查网络请求,F12打开开发者面板进入network时刻注意操作后的网络请求,即使是普通的页面请求通过这里查看也更加精确,好过直接查看element选项卡。
1.3 Canvas 指纹追踪
部分网站利用 Canvas 进行指纹识别,以检测爬虫行为。
示例代码:
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.fillText('Hello, World!', 10, 10);
const fingerprint = canvas.toDataURL();
console.log(fingerprint);
应对策略:
- 使用
Canvas Defender之类的扩展工具随机化指纹信息。 - 通过 Puppeteer 修改
canvas.toDataURL()返回固定值:await page.evaluate(() => {HTMLCanvasElement.prototype.toDataURL = () => 'fake-image'; });
心得: Canvas 指纹追踪主要用于区分真实用户与自动化脚本,针对这一点可以使用指纹篡改工具或 Puppeteer 进行规避。
1.4 验证码与行为分析
某些网站采用验证码(如 reCAPTCHA)或基于用户交互模式(鼠标轨迹、按键节奏等)进行检测。
示例代码:
<input type="text" onfocus="logActivity()" onmousemove="logActivity()">
应对策略:
- 针对文本验证码,可使用 OCR 技术(如
Tesseract.js)进行解析。 - 通过 Puppeteer 模拟用户输入行为,以规避行为分析:
await page.mouse.move(100, 100); await page.mouse.click(100, 100);
心得: 在遇到验证码时,建议首先尝试 API 解析方式,若无法突破,则考虑 OCR 或模拟用户行为。
2. 反爬绕过实践
2.1 Puppeteer 绕过反爬机制
Puppeteer 是一个基于 Chromium 的无头浏览器工具,可用于模拟用户操作,绕过前端反爬限制。
示例代码:
const puppeteer = require('puppeteer');
(async () => {const browser = await puppeteer.launch({ headless: false });const page = await browser.newPage();await page.goto('https://example.com');await page.waitForTimeout(3000);await browser.close();
})();
心得: Puppeteer 适用于高度依赖 JavaScript 渲染的网站,能有效绕过多数前端反爬机制。
2.2 DrissionPage 绕过反爬机制
DrissionPage 是一个结合 Selenium 和 Requests 的 Python 爬虫工具,能够应对前端 JavaScript 渲染。
示例代码:
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('https://example.com')
print(page.html)
心得: DrissionPage 结合了浏览器模拟与传统 HTTP 请求,在某些场景下比 Puppeteer 更加高效。拽神是这样的。
3. 结论
随着 Web 反爬技术的不断演进,开发者需要深入理解 JavaScript 反爬策略及绕过方法,同时应遵循数据抓取的法律与伦理规范。合理使用 Web 爬取技术,将有助于促进数据利用的合法化和高效化。
在数据爬取过程中,既要注重技术手段的优化,也要确保数据获取的合规性,以避免法律风险。
相关文章:
JavaScript反爬技术解析与应对
JavaScript 反爬技术解析与应对 前言 在当今 Web 爬虫与数据抓取的生态环境中,网站运营方日益关注数据安全与隐私保护,因此逐步采用多种反爬技术来限制非授权访问。本文从 JavaScript 角度出发,深入剖析主流反爬策略的技术原理,…...
[NOIP2007]矩阵取数游戏
点我写题 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素; 2.每次取走的…...
在Linux系统上安装.NET
测试系统:openKylin(开放麒麟) 1.确定系统和架构信息: 打开终端(Ctrl Alt T),输入cat /etc/os-release查看系统版本相关信息。 输入uname -m查看系统架构。确保你的系统和架构符合.NET 的要求,如果架构…...
PCB Editor层叠文件(Gerber文件输出-01)
先看底层和表层,如下图 钢网表层和底层,如下图 丝印表层和底层,如下图 阻焊表层和底层,如下图 下面来添加钻孔层,先提取钻孔表 点击OK后钻孔表会挂在鼠标上...
labelimg闪退的解决办法
其实就是你的python版本太高不稳定不支持labelimg 标记时出现闪退 问题原因:python版本过高 解决方案 第一步: 在python3.9以上的版本运行软件会闪退,这个时候我们需要创建一个3.9或者及以下的虚拟环境 conda cr…...
【开源免费】基于Vue和SpringBoot的在线文档管理系统(附论文)
本文项目编号 T 038 ,文末自助获取源码 \color{red}{T038,文末自助获取源码} T038,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...
数据库管理-第287期 Oracle DB 23.7新特性一览(20250124)
数据库管理287期 20245-01-24 数据库管理-第287期 Oracle DB 23.7新特性一览(20250124)1 AI向量搜索:算术和聚合运算2 更改Compatible至23.6.0,以使用23.6或更高版本中的新AI向量搜索功能3 Cloud Developer包4 DBMS_DEVELOPER.GET…...
Golang :用Redis构建高效灵活的应用程序
在当前的应用程序开发中,高效的数据存储和检索的必要性已经变得至关重要。Redis是一个快速的、开源的、内存中的数据结构存储,为各种应用场景提供了可靠的解决方案。在这个完整的指南中,我们将学习什么是Redis,通过Docker Compose…...
四层网络模型
互联网由终端主机、链路和路由器组成,数据通过逐跳的方式,依次经过每条链路进行传输。 网络层的工作是将数据包从源端到目的端,跨越整个互联网。 网络层的数据包称为数据报。网络将数据报交给链路层,指示它通过第一条链路发送数据…...
CUDA学习-内存访问
一 访存合并 1.1 说明 本部分内容主要参考: 搞懂 CUDA Shared Memory 上的 bank conflicts 和向量化指令(LDS.128 / float4)的访存特点 - 知乎 1.2 share memory结构 图1.1 share memory结构 放在 shared memory 中的数据是以 4 bytes(即 32 bits)作为 1 个 word,依…...
进程通讯——类型和发展
进程常用交互方法如上...
在 Windows 11 中为 SMB 3.x 文件共享协议提供 RDMA 支持
注:机翻,未校。 Enable SMB Direct in Windows 11 在 Windows 11 中启用 SMB Direct Provides RDMA support for the SMB 3.x file sharing protocol 为 SMB 3.x 文件共享协议提供 RDMA 支持 Vigneshwaran Vijayakumar November 3, 2024 Last Updat…...
C 标准库 - `<errno.h>`
C 标准库 - <errno.h> 引言 在C语言编程中,正确处理错误是保证程序稳定性和可靠性的关键。C标准库中的<errno.h>头文件提供了错误码定义和宏,使得开发者能够更好地管理和处理程序运行过程中可能出现的错误。本文将详细介绍<errno.h>头文件的作用、常用错…...
2025年01月28日Github流行趋势
项目名称:maybe 项目地址url:https://github.com/maybe-finance/maybe项目语言:Ruby历史star数:37540今日star数:1004项目维护者:zachgoll, apps/dependabot, tmyracle, Shpigford, crnsh项目简介ÿ…...
7. 马科维茨资产组合模型+金融研报AI长文本智能体(Qwen-Long)增强方案(理论+Python实战)
目录 0. 承前1. 深度金融研报准备2. 核心AI函数代码讲解2.1 函数概述2.2 输入参数2.3 主要流程2.4 异常处理2.5 清理工作2.7 get_ai_weights函数汇总 3. 汇总代码4. 反思4.1 不足之处4.2 提升思路 5. 启后 0. 承前 本篇博文是对前两篇文章,链接: 5. 马科维茨资产组…...
Android 启动流程
一 Bootloader 在嵌入式系统中,Bootloader的引导过程与传统的PC环境有所不同,主要是因为嵌入式系统的硬件配置和应用场景更加多样化。以下是嵌入式系统中Bootloader被引导的一般流程: 1. 硬件复位 当嵌入式设备上电或复位时,处…...
庆祝2025到来:C++编程的新篇章
作者:w(゚Д゚)w吓洗宝宝了 发布时间:2025年1月19日00:00 引言 新年伊始,万象更新。在这充满希望的2025年,我们迎来了新的机遇和挑战。作为C编程爱好者的一员,我感到无比激动和自豪。C作为一种强…...
基于STM32的智能家用温控器设计
目录 引言系统设计 硬件设计软件设计 系统功能模块 温度监测模块自动加热与制冷模块用户交互与显示模块节能模式与定时功能模块远程控制与数据上传模块 控制算法 温度调节算法定时任务与节能优化算法数据记录与反馈算法 代码实现 温度监测与自动控制代码定时与节能模式代码数据…...
扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(14)
在数字化时代,音频内容的重要性不言而喻。无论是在线课程、有声读物,还是各种多媒体应用,音频都是传递信息、增强体验的关键元素。扣子平台的音频功能,为开发者和内容创作者提供了一个强大而灵活的工具,让音频的使用和…...
Dismissible组件的用法
文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了GestureDetector Widget相关的内容,本章回中将介绍Dismissible Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的Dismissible是一个事件响应Widget,它和GestureDetector类似,不过它只…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
