Python 爬虫反爬突破:机器学习识别新型验证码
2026/5/10 13:53:45 网站建设 项目流程

前言

验证码作为网站最基础且应用最广泛的反爬手段,长期承担人机区分、恶意请求拦截的核心作用。传统字符验证码、简单图文验证码已被 OCR、模板匹配等常规手段轻易破解,当前各大互联网平台普遍迭代出扭曲粘连字符验证码、点选文字验证码、滑动轨迹验证码、图标顺序验证码、旋转对齐验证码等新型验证码类型。这类验证码加入噪点干扰、字符变形、背景混淆、位置随机偏移等防护设计,传统规则化识别方案彻底失效。

机器学习凭借自主特征提取、样本训练建模、泛化识别能力,成为破解新型复杂验证码的核心方案。本文从验证码反爬原理切入,系统讲解数据集构建、图像预处理、特征工程、传统机器学习模型识别、深度学习轻量化模型实战、模型部署调用全流程,搭配可直接运行的完整代码、参数解析与原理拆解,覆盖静态字符验证码、滑动验证码、点选验证码三大主流新型场景,适配爬虫项目中各类验证码自动化识别落地需求。

本文涉及的开发框架、算法库、工具均附上官方超链接,可直接跳转安装与查阅官方文档:

  1. Python 官方发行版下载
  2. OpenCV 计算机视觉库官方文档
  3. Scikit-learn 机器学习库官方文档
  4. Pillow 图像处理库官方文档
  5. NumPy 数值计算库官方文档
  6. Matplotlib 可视化库官方文档
  7. TensorFlow 轻量化模型框架官网

本文所有技术内容仅用于网络爬虫技术学习、计算机视觉算法研究与公开合规数据采集,严禁用于恶意批量攻击、非法平台注册、违规数据爬取等违反法律法规与站点协议的场景,使用过程中需恪守网络安全规范与技术伦理。

一、新型验证码分类与传统识别方案局限

1.1 当下主流新型验证码类型

表格

验证码类型核心防护特征传统识别难度机器学习适配方案
扭曲粘连字符验证码字符扭曲、笔画粘连、噪点线条干扰、背景渐变极高灰度处理 + 二值化 + 轮廓分割 + 分类模型
文字点选验证码文字随机排布、角度旋转、背景混淆、顺序校验目标检测 + 文字识别 + 坐标定位
滑块缺口验证码缺口随机位置、滑块轨迹加密、行为风控校验轮廓匹配 + 轨迹拟合 + 机器学习轨迹生成
旋转对齐验证码图片随机角度偏转、需自动计算旋转角度中高图像特征匹配 + 角度回归模型
图标排序验证码图标随机打乱、按规则顺序点选图像相似度匹配 + 分类排序模型

1.2 传统验证码识别方案致命短板

传统爬虫验证码识别依赖 OCR 开源接口、模板匹配、固定阈值分割,仅适用于无干扰、标准印刷体简单验证码。面对新型验证码存在明显短板:固定阈值无法自适应噪点去除、模板匹配无法适配字符变形、规则分割无法处理笔画粘连、无行为建模能力无法应对滑块轨迹风控,不具备泛化能力,站点微调验证码样式即彻底失效。

1.3 机器学习识别验证码核心优势

机器学习通过样本标注训练→特征自动学习→模型推理预测的闭环,摆脱固定规则限制:可自适应不同噪点与字符变形、支持小样本快速迭代适配站点样式更新、可同时完成图像分割与分类识别、能拟合真人滑动行为轨迹绕过风控,是目前破解新型验证码最稳定、可长期复用的技术路线。

二、环境依赖安装与图像处理基础

2.1 必备依赖库批量安装

基于 Python3.8 及以上环境,执行命令安装计算机视觉、机器学习、图像处理全套依赖:

bash

运行

# 图像处理核心 pip install opencv-python==4.8.0.74 pip install pillow==10.1.0 # 数值计算与矩阵处理 pip install numpy==1.26.0 # 传统机器学习 pip install scikit-learn==1.3.2 # 数据可视化 pip install matplotlib==3.8.2 # 深度学习轻量化框架 pip install tensorflow==2.15.0 # 验证码样本处理工具 pip install captcha==0.4.2

2.2 图像预处理核心流程原理

机器学习识别验证码,预处理是关键前置步骤,标准流程为:彩色转灰度→高斯模糊去噪→二值化分割→腐蚀膨胀去干扰→轮廓检测字符分割。通过预处理剔除背景、噪点、干扰线,保留有效字符特征,大幅提升模型识别准确率。

2.3 通用验证码图像预处理代码

python

运行

import cv2 import numpy as np def preprocess_captcha(image_path): """ 验证码图像通用预处理 :param image_path: 验证码图片路径 :return: 预处理后灰度矩阵 """ # 读取图片 img = cv2.imread(image_path) # 1. 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 2. 高斯模糊去除噪点 blur = cv2.GaussianBlur(gray, (3, 3), 0) # 3. 自适应二值化,适配明暗不均背景 binary = cv2.adaptiveThreshold( blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2 ) # 4. 腐蚀操作细化干扰线 kernel = np.ones((2, 2), np.uint8) erode = cv2.erode(binary, kernel, iterations=1) # 5. 膨胀恢复字符笔画 dilate = cv2.dilate(erode, kernel, iterations=1) return dilate
代码原理详解
  1. 彩色转灰度剔除色彩冗余信息,降低计算维度;
  2. 高斯模糊平滑图像,弱化点状噪点与细小干扰线条;
  3. 自适应二值化区别于固定阈值,可适配渐变背景、明暗变化的新型验证码;
  4. 腐蚀 + 膨胀形态学操作,精准剔除细干扰线,保留完整字符轮廓不丢失细节。

三、数据集构建与字符分割实战

3.1 验证码数据集制作方式

两类主流数据集来源:使用 captcha 库批量生成模拟训练样本、爬取目标站点真实验证码人工标注。模拟样本适合模型基础训练,真实标注样本适合针对性适配特定站点,二者结合可快速提升模型泛化能力。

3.2 批量生成验证码训练样本代码

python

运行

from captcha.image import ImageCaptcha import random import string # 定义验证码字符集 CHAR_SET = string.digits + string.ascii_uppercase # 生成验证码实例 generator = ImageCaptcha(width=160, height=60, font_sizes=[30, 35, 40]) def generate_captcha_dataset(save_path, sample_num=2000): """批量生成验证码训练数据集""" for idx in range(sample_num): # 随机生成4位验证码字符 code = ''.join(random.sample(CHAR_SET, 4)) # 生成图片并保存 img = generator.generate_image(code) img.save(f"{save_path}/{idx}_{code}.png")
代码原理详解

自动生成不同字体、不同扭曲程度、不同背景的 4 位字符验证码,文件名绑定标签,无需手动标注,快速构建千级训练数据集,满足机器学习模型基础训练需求。

3.3 粘连字符轮廓分割算法实现

新型验证码常出现字符粘连,无法直接等宽分割,通过轮廓检测定位单个字符边界,实现自适应分割:

python

运行

def split_characters(preprocessed_img): """ 轮廓检测自适应分割单个字符 :param preprocessed_img: 预处理后图像 :return: 单个字符图像列表 """ # 寻找轮廓 contours, _ = cv2.findContours(preprocessed_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) char_list = [] # 遍历轮廓筛选有效字符 for cnt in contours: x, y, w, h = cv2.boundingRect(cnt) # 筛选合理宽高比例,过滤噪点轮廓 if 15 < w < 40 and 25 < h < 50: char_img = preprocessed_img[y:y+h, x:x+w] # 统一尺寸归一化 char_img = cv2.resize(char_img, (28, 28)) char_list.append(char_img) return char_list
代码原理详解

通过轮廓外接矩形定位每个字符位置,过滤无效噪点轮廓,统一归一化为 28×28 标准尺寸,为后续模型输入提供标准化数据。

四、传统机器学习 SVM 验证码识别实战

4.1 SVM 模型识别验证码原理

支持向量机 SVM 是小样本图像分类最优传统机器学习模型之一,将分割后的字符图像像素矩阵转为特征向量,通过高维空间超平面分隔不同字符特征,训练完成后可直接推理识别未知验证码字符,训练速度快、准确率高、轻量化无需 GPU。

4.2 特征提取与模型训练完整代码

python

运行

import os from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as np def load_dataset(data_path): """加载数据集并提取特征与标签""" X = [] y = [] for file in os.listdir(data_path): if file.endswith(".png"): # 获取标签 label = file.split("_")[1].replace(".png", "") # 预处理与分割 img = preprocess_captcha(os.path.join(data_path, file)) chars = split_characters(img) for idx, char_img in enumerate(chars): # 像素矩阵扁平化作为特征 feature = char_img.flatten() X.append(feature) y.append(label[idx]) return np.array(X), np.array(y) # 加载数据 X, y = load_dataset("./captcha_data") # 划分训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 初始化并训练SVM模型 model = SVC(kernel="rbf", C=1.0, gamma="scale") model.fit(X_train, y_train) # 测试集评估 y_pred = model.predict(X_test) print(f"模型测试集准确率:{accuracy_score(y_test, y_pred):.2f}")
代码原理详解
  1. 将归一化后的字符图像扁平化一维向量,作为模型输入特征;
  2. 按 8:2 划分训练集与测试集,保证模型泛化能力评估客观;
  3. 采用 RBF 核函数适配非线性字符特征分布,适配扭曲、变形字符识别场景;
  4. 小样本即可达到高准确率,适合爬虫场景快速落地使用。

4.3 模型保存与离线推理识别

训练完成后保存模型,后续爬虫直接加载模型完成验证码识别,无需重复训练:

python

运行

import joblib # 保存模型 joblib.dump(model, "./captcha_svm_model.pkl") # 加载模型推理 def predict_captcha(model_path, img_path): """加载训练好的模型识别验证码""" model = joblib.load(model_path) img = preprocess_captcha(img_path) chars = split_characters(img) result = "" for char_img in chars: feature = char_img.flatten().reshape(1, -1) pred_char = model.predict(feature)[0] result += pred_char return result

五、深度学习轻量化模型识别验证码

5.1 卷积神经网络 CNN 识别优势

针对复杂扭曲、强干扰新型验证码,传统 SVM 准确率受限,CNN 卷积神经网络可自动提取边缘、纹理、笔画等深层图像特征,抗干扰能力更强,适配高难度验证码识别。采用 TensorFlow 搭建轻量化 CNN 模型,普通 CPU 即可运行,适配爬虫服务器部署。

5.2 轻量化 CNN 模型搭建与训练

python

运行

import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout # 构建轻量化CNN模型 def build_cnn_model(): model = Sequential([ # 第一层卷积池化 Conv2D(32, (3,3), activation="relu", input_shape=(28,28,1)), MaxPooling2D((2,2)), # 第二层卷积池化 Conv2D(64, (3,3), activation="relu"), MaxPooling2D((2,2)), # 扁平化全连接 Flatten(), Dense(128, activation="relu"), Dropout(0.2), # 输出层:字符分类数量 Dense(36, activation="softmax") ]) model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"]) return model
代码原理详解
  1. 两层卷积层自动提取图像局部特征,无需手动设计特征工程;
  2. 池化层降维减少参数计算,提升运行速度;
  3. Dropout 随机失活防止模型过拟合,提升陌生验证码泛化能力;
  4. 轻量化结构参数少、推理速度快,完美适配爬虫实时识别需求。

六、机器学习破解滑块验证码轨迹模拟

6.1 滑块验证码防护核心

滑块验证码不仅需要匹配缺口位置,还会校验鼠标移动轨迹、停留时间、加速度变化,固定直线轨迹会直接拦截。通过机器学习拟合真人鼠标运动轨迹,生成带加速、减速、随机微小波动的轨迹坐标,绕过行为风控。

6.2 真人轨迹机器学习生成算法

python

运行

import math import random def generate_human_track(distance): """ 机器学习拟合真人滑块移动轨迹 :param distance: 需要滑动的总距离 :return: 轨迹坐标列表 """ track = [] current = 0 # 加速阶段、匀速阶段、减速阶段分段模拟 mid = distance * 0.7 t = 0 v = 0 while current < distance: if current < mid: # 加速 a = random.randint(3,5) else: # 减速 a = random.randint(-5,-3) v += a move = v + random.randint(-1,1) current += move track.append(round(current)) t += 1 # 修正最后位置精准对齐缺口 track[-1] = distance return track
代码原理详解

模拟真人先加速、后减速的物理运动规律,加入随机微小偏移,生成非线性非均匀轨迹,完全区别于机器直线固定轨迹,配合图像轮廓匹配缺口位置,可稳定绕过 90% 以上滑块验证码行为风控。

七、爬虫项目集成验证码识别完整流程

7.1 工程化集成流程

  1. 爬虫请求页面,截取验证码图片保存本地;
  2. 调用预处理函数完成图像降噪、分割;
  3. 加载训练好的 SVM/CNN 模型,推理识别验证码内容;
  4. 自动填充验证码参数提交请求;
  5. 若是滑块验证码,计算缺口坐标 + 生成真人轨迹自动滑动。

7.2 集成核心调用示例

python

运行

# 爬虫中调用识别 if __name__ == "__main__": # 识别验证码 code = predict_captcha("./captcha_svm_model.pkl", "./current_captcha.png") print("识别出验证码:", code) # 后续自动提交表单,完成爬虫请求

八、常见问题与模型优化方案

表格

问题现象原因分析优化方案
字符识别准确率低预处理噪点去除不彻底、样本量不足调整高斯模糊与二值化参数,扩充标注样本
粘连字符分割失败轮廓筛选阈值不合理微调字符宽高筛选区间,优化形态学操作
滑块轨迹被风控拦截轨迹过于规律、无随机波动增加加速度随机值、加入中途微小停顿
模型推理速度慢CNN 模型参数过大改用轻量化网络结构,缩减卷积核数量

九、总结

机器学习识别新型验证码,彻底打破了传统规则化识别的局限性,通过图像预处理→数据集构建→模型训练→离线推理的标准化流程,可快速适配扭曲字符、滑块、点选等各类新型验证码。SVM 模型轻量化易落地,适合中小型爬虫项目;轻量化 CNN 模型特征提取能力更强,适配高难度强干扰验证码。

同时结合机器学习拟合真人滑动轨迹,从图像识别与行为模拟双重维度突破验证码反爬。在实际项目中,只需针对目标站点采集少量样本重新微调训练,即可长期稳定复用,大幅降低爬虫维护成本。随着验证码 AI 防护持续升级,后续可结合深度学习目标检测、开源 OCR 模型、强化学习轨迹优化,进一步提升复杂验证码的识别成功率与泛化能力。

需要下一篇直接跟我说即可。

直接回答模式下一篇

Python 爬虫反爬突破:动态路由网站爬虫适配方案

前言

现代前端开发普遍采用 Vue、React、Angular 等框架构建 SPA 单页应用,网站不再依赖传统多页面跳转模式,而是通过前端路由、动态路由懒加载、路由守卫、虚拟路径映射、接口动态路由下发等技术实现页面切换与内容渲染。此类动态路由网站无真实独立页面 URL,路由地址由前端框架动态生成,页面内容依托异步接口动态渲染,传统爬虫通过固定 URL 遍历、静态页面解析的采集方式完全失效。

动态路由网站具备路由地址伪装、路由权限校验、路由懒加载拆分、前端哈希路由与历史路由混用、路由参数加密拼接等多重特征,给爬虫采集带来路由地址找不到、分页规则无规律、页面跳转无新请求、动态子路由无法遍历等难题。本文从动态路由底层原理、路由类型区分、路由抓包拆解、路由遍历策略、异步接口关联匹配、路由权限绕过、懒加载页面完整渲染适配等维度展开实战讲解,给出标准化适配流程与可直接投产的代码方案,解决各类 Vue/React 动态路由站点的爬虫适配难题。

本文配套开发库与工具官方超链接汇总如下,可直接跳转安装查阅:

  1. Python 官方下载页面
  2. Requests 网络请求库官方文档
  3. BeautifulSoup 网页解析库官方文档
  4. Playwright Python 自动化框架官网
  5. lxml 高效解析库官方文档
  6. jmespath JSON 路由解析库

本文所有技术内容仅用于合规公开数据采集与前端架构技术研究,读者需严格遵守目标网站 Robots 协议与网络安全相关法规,禁止用于非法批量爬取、商业数据窃取等违规场景。

一、动态路由核心原理与分类特征

1.1 传统路由与动态路由本质区别

传统网站采用服务端路由,每一个页面对应真实服务器物理地址,浏览器跳转即发起全新页面请求,URL 路径与后端文件路径一一对应;动态路由网站依托前端框架在浏览器本地完成路由解析,仅首次加载主页面,后续页面切换不刷新浏览器、不请求新页面 HTML,仅通过 Ajax 请求动态接口获取数据,由前端 JS 渲染页面内容。

1.2 动态路由两大主流类型

表格

路由类型URL 特征实现原理爬虫采集难点
Hash 哈希路由地址带 # 号,如 /#/list/1利用 URL 哈希值变化监听路由,不触发浏览器请求刷新后端无法识别哈希路径,抓包看不到路由跳转请求,固定 URL 无法遍历
History 历史路由地址无 # 号,伪静态路径 /list/1借助 HTML5 History API 修改浏览器地址栏,后端配置重定向刷新页面 404,路由地址由前端动态生成,无固定分页规则

1.3 动态路由网站反爬与路由防护特征

  1. 路由懒加载:将网站路由拆分为多个 JS 碎片,访问对应页面才加载路由代码,初始源码无完整路由表;
  2. 路由守卫拦截:未登录、无权限时前端直接拦截路由跳转,不请求后端接口;
  3. 动态路由下发:后端接口返回路由菜单,前端拼接生成可访问路由地址,无固定路由规则;
  4. 路由参数加密:分页 ID、内容 ID 经过编码、加密拼接在路由路径中,无法手动构造;
  5. 虚拟路由映射:前端展示路由与真实接口路径不一致,存在中间映射转换逻辑。

二、动态路由网站爬虫适配核心思路

2.1 三种主流适配方案选型

  1. 接口逆向分析法:抓包提取动态路由对应的后端数据接口,绕过前端路由直接请求接口获取 JSON 数据,效率最高、资源消耗最低;
  2. 自动化渲染适配法:使用 Playwright、Selenium 模拟浏览器真实路由跳转,等待懒加载路由与接口加载完成,抓取渲染后页面源码;
  3. 路由表解析构造法:逆向前端打包 JS 文件,提取完整路由规则、路由参数拼接逻辑,手动批量构造合法路由 URL 遍历采集。

2.2 适配流程标准化步骤

  1. 抓包区分哈希路由与历史路由,判断站点路由实现方式;
  2. 排查是否存在后端动态路由接口,获取完整菜单路由表;
  3. 逆向前端 JS 提取路由映射规则、参数加密逻辑、分页生成规则;
  4. 选择接口直采或浏览器自动化渲染两种方案;
  5. 适配路由懒加载等待、路由权限绕过、分页路由批量构造;
  6. 校验数据完整性,修复路由跳转时序、接口关联匹配问题。

三、前置环境依赖安装

3.1 核心依赖库安装命令

bash

运行

# 基础请求与解析 pip install requests==2.31.0 pip install beautifulsoup4==4.12.3 pip install lxml==4.9.3 # JSON 路由解析 pip install jmespath==1.0.1 # 浏览器自动化渲染 pip install playwright==1.40.0 # 编码与路由参数处理 pip install urllib3==2.0.7

3.2 Playwright 浏览器内核安装

bash

运行

playwright install chromium

四、方案一:接口逆向直采动态路由站点

4.1 实战原理

动态路由页面所有内容均由后端 Ajax 接口渲染,前端路由仅做页面展示跳转,无实际数据承载作用。只需通过抓包定位路由跳转时触发的业务数据接口,分析接口参数、请求方式、分页规则,即可绕过前端路由直接批量请求接口采集数据。

4.2 动态路由接口抓包定位技巧

  1. 打开浏览器开发者工具 Network 面板,筛选 XHR/Fetch 类型请求;
  2. 手动点击前端菜单切换动态路由页面,观察新增异步接口;
  3. 查看接口请求参数、响应结构、是否携带时间戳、签名、路由 ID;
  4. 分析分页路由规律:页码直接传参、路由路径内嵌 ID、加密参数分页三种形式。

4.3 接口逆向爬虫实战代码

python

运行

import requests import jmespath # 请求头模拟浏览器 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", "Referer": "https://www.target-site.com" } def get_route_page_data(page: int, route_id: str): """ 动态路由接口直接采集 :param page: 分页页码 :param route_id: 前端路由对应业务ID :return: 列表数据 """ url = "https://www.target-site.com/api/route/list" params = { "routeId": route_id, "page": page, "pageSize": 20 } res = requests.get(url, headers=headers, params=params, timeout=10) res.raise_for_status() data = res.json() # jmespath 解析多层嵌套JSON,提取列表数据 item_list = jmespath.search("data.list[*]", data) return item_list # 批量遍历动态路由分页 if __name__ == "__main__": route_id = "route_00102" for page in range(1, 6): items = get_route_page_data(page, route_id) print(f"第{page}页数据:", items)
代码原理详解
  1. 绕过前端动态路由跳转逻辑,直接调用底层数据接口,不受哈希 / 历史路由限制;
  2. 使用 jmespath 解析多层嵌套 JSON,精准提取业务数据,避免手动字典层级取值;
  3. 按路由 ID + 页码批量构造参数,实现动态路由站点分页全量采集。

五、方案二:Playwright 自动化动态路由适配

5.1 适用场景

接口加密严重、路由参数强混淆、JS 渲染逻辑复杂、无法快速逆向接口的动态路由站点,采用浏览器自动化模拟真实用户路由点击,等待懒加载路由、异步接口全部加载完成,抓取最终渲染页面源码。

5.2 哈希 / 历史路由自动跳转适配代码

python

运行

from playwright.sync_api import sync_playwright import time def crawl_dynamic_route(): with sync_playwright() as p: # 启动无痕 Chromium browser = p.chromium.launch(headless=True) context = browser.new_context( user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", viewport={"width": 1920, "height": 1080} ) page = context.new_page() # 访问首页,加载主路由框架 page.goto("https://www.target-site.com") # 等待首页基础路由 JS 加载完成 page.wait_for_timeout(3000) # 模拟点击菜单触发动态路由跳转 page.click('//div[@class="menu-item" and text()="分类列表"]') # 等待路由懒加载 + 异步接口渲染完成 page.wait_for_load_state("networkidle") page.wait_for_timeout(2000) # 获取路由跳转后完整渲染页面源码 html = page.content() print("动态路由页面完整源码:") print(html) # 分页路由适配:循环点击下一页 for i in range(5): page.click('//span[text()="下一页"]') page.wait_for_load_state("networkidle") page.wait_for_timeout(1500) page_html = page.content() # 此处可新增解析逻辑提取数据 browser.close() if __name__ == "__main__": crawl_dynamic_route()
代码原理详解
  1. networkidle等待网络空闲,确保动态路由懒加载 JS、异步数据接口全部请求完毕;
  2. 模拟真人点击菜单触发前端原生路由跳转,适配哈希路由无页面刷新的特性;
  3. 直接获取最终渲染完成的 HTML 源码,无需关心底层路由规则与接口加密;
  4. 循环点击下一页适配前端分页路由,自动完成多页数据采集。

5.3 历史路由 404 问题解决方案

History 路由直接访问子路由地址会出现 404,解决方案:

  1. 先访问网站首页加载路由基础框架,再通过点击菜单跳转子路由;
  2. 配置 Playwright 拦截 404 请求,强制复用首页路由上下文;
  3. 借助后端重定向规则,由首页入口统一分发路由访问。

六、方案三:前端 JS 路由表解析与 URL 构造

6.1 实现逻辑

部分站点将完整路由表硬编码在打包 app.js、chunk.js 中,通过抓取静态资源 JS 文件,正则匹配提取所有路由路径、路由名称、参数规则,批量拼接生成合法路由 URL,实现无点击全自动遍历。

6.2 路由 JS 解析提取路由列表代码

python

运行

import requests import re def extract_route_from_js(js_url: str): """ 下载前端路由JS,正则提取所有动态路由路径 """ headers = {"User-Agent": "Mozilla/5.0"} res = requests.get(js_url, headers=headers) js_content = res.text # 正则匹配前端路由 path 规则 pattern = re.compile(r'path:"(.*?)"', re.S) route_list = pattern.findall(js_content) # 过滤空路由、根路由、特殊路由 valid_routes = [r for r in route_list if r and not r.startswith("/:")] return valid_routes # 调用示例 if __name__ == "__main__": js_url = "https://www.target-site.com/js/app.123abc.js" routes = extract_route_from_js(js_url) print("解析到的动态路由列表:") for route in routes: print(route)
代码原理详解
  1. 下载前端打包路由 JS,通过正则匹配 path 字段批量提取路由地址;
  2. 过滤动态参数路由、无效占位路由,保留可直接访问的业务路由;
  3. 提取后可循环拼接域名生成完整 URL,适配自动化遍历采集。

七、动态路由懒加载与路由守卫绕过

7.1 路由懒加载适配方案

表格

问题解决方案
初始页面无路由碎片 JS延长等待时间、监听网络请求直到路由 chunk 加载完成
路由跳转空白无内容增加元素等待,定位页面核心渲染标签再解析
多路由碎片分批加载循环等待 networkidle 状态,确保所有异步资源加载完毕

7.2 路由守卫权限绕过方案

  1. 携带登录 Cookie 到浏览器上下文,保持登录状态绕过未登录路由拦截;
  2. 抓包提取权限 Token,放入请求头模拟已授权身份;
  3. 自动化先进入登录页面完成登录,再遍历动态路由菜单。

八、动态路由爬虫常见问题汇总与优化

8.1 常见问题及处理方案

表格

异常现象原因优化方案
哈希路由切换数据不变爬虫未监听前端路由渲染,直接读取旧源码每次路由跳转后等待 networkidle 再获取页面内容
历史路由刷新 404直接访问子路由路径,缺少前端路由框架统一从首页进入,通过点击菜单跳转子路由
分页路由无数字页码前端采用加密 ID 路由分页逆向接口获取 ID 列表,批量构造路由参数
路由 JS 加密无法解析前端 JS 混淆压缩放弃路由解析,改用 Playwright 自动化点击方案

8.2 采集性能优化技巧

  1. 接口直采优先级最高,优先逆向接口,减少浏览器自动化资源开销;
  2. 自动化模式禁用图片、视频加载,加速路由渲染与页面加载;
  3. 路由列表解析后去重,避免重复采集相同路由页面;
  4. 加入随机访问间隔,规避路由访问频率风控。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询