cdut-admission-auto
🎯 项目背景
这篇文章分享的是成都理工大学招生信息网(🔗学院专业页面)的自动化爬取实战。它集成了瑞数五代动态验证、自动化行为检测、动态 Cookie/请求头校验等一系列重磅反爬屏障,直接使用 requests/urllib 裸连根本拿不到真实数据,必须借助带有完整浏览器渲染能力的方案才能突破。
最终我们实现了一条龙流程:绕过所有防护 → 模拟人类操作 → 提取学院专业数据 → 导出 Excel。
🕵️ 网页快速分析
先快速看一眼目标页结构:
- 表面上看是一个学院专业列表的静态布局,但刷新页面会发现有短暂的瑞数安全跳转
- 数据通过
ul.xy-list下的li.li1包裹每个学院,每个学院下用dd > a存放专业名称和链接
通过开发者工具的 Network + Console 观察防护层的细节:
- 首次请求会返回瑞数混淆脚本,生成类似
sMLAeTqisZbFP这样的动态 Cookie - 脚本会检测
navigator.webdriver、浏览器特征变量、鼠标/键盘交互行为 - 412 错误是请求头缺失的典型表现,而 SSL 证书偶尔会在本地测试时触发验证失败
🚩 核心问题清单
- 动态 Cookie 更新:瑞数生成的 Cookie 有效期极短,纯静态维护会立刻失效
- 瑞数五代绕过:混淆 JS 动态生成验证数据,静态逆向难度极大
- SSL 证书验证:部分测试环境会拦截 HTTPS 请求,导致连接失败
- 完整请求头构建:Referer、Accept-Language、Sec-Fetch-* 这些字段缺一个就可能被拦截
- 反自动化检测:必须隐藏浏览器自动化特征,并模拟真实用户操作
🏗️ 技术架构
我们采用了 「DrissionPage 浏览器自动化 + 反检测 JS 注入 + urllib 安全请求」 的混合方案:
- DrissionPage:比 Selenium 轻量得多,自带智能等待机制,特别适合处理复杂渲染页面
- 反检测 JS:在页面加载初期直接注入,覆盖掉浏览器暴露的自动化特征
- urllib:在拿到有效 Cookie 后,用来做数据抓取的轻量请求,降低浏览器资源的持续消耗
这样搭配的核心思路是:让浏览器去冲过瑞数验证,后续数据提取用轻量请求完成,既安全又高效。
💻 核心功能实现
1. 浏览器初始化配置
⚠️ 关键参数说明:
timeout=15:给足瑞数脚本执行的时间,避免过早操作导致验证失败set.window.max():最大化窗口可避免小窗口、固定分辨率这类典型的自动化特征
2. 反自动化 JS 注入
瑞数会通过检查 navigator.webdriver、CDP 注入留下的特征变量、甚至 debugger 断点来识别爬虫。我们在页面加载前注入 JS,直接针对这些检测点进行覆盖:
这段 JS 会在浏览器加载目标页面后第一时间运行,确保在瑞数脚本获取特征之前就把漏洞堵上。
3. 人类行为模拟
单靠隐藏特征还不够,瑞数还会监测鼠标、键盘、滚动等交互行为。加一段简单的随机操作就能大幅提高通过率:
这里的所有时间间隔都故意加了随机抖动,模仿人类不精确的操作节奏。
4. 瑞数安全核心绕过
整个方案的关键逻辑:先让浏览器正面硬刚瑞数验证,验证通过后把有效 Cookie 传给 urllib 做后续轻量请求。
⚠️ 如果验证失败,别慌,先检查反检测 JS 是否还适配当前瑞数版本,必要时抓包更新。
📡 请求构造模块
拿到有效 Cookie 后,我们用 urllib 封装安全请求,避免频繁打开/关闭浏览器页面,也降低了被反爬系统持续监控的风险。
1. 动态 Cookie 提取
这里提取的关键 Cookie 有两个:
JSESSIONID:常规会话标识sMLAeTqisZbFP:瑞数五代动态令牌(名称可能动态变化,但模式类似)
2. 完整请求头构建
瑞数对请求头极度敏感,Referer、User-Agent、Accept-Language、Sec-Fetch-* 系列字段一个都不能少:
这套请求头严格模仿了真实 Chrome 浏览器的请求特征,可以避免 412 这类由请求头缺失导致的拦截。
3. 安全请求封装
加入随机延迟、重试机制、禁用 SSL 验证(仅限测试环境):
重试间隔和请求间隔都加了随机数,避免过于规律的节奏被反爬系统识别。
📊 数据提取与导出
拿到真实的 HTML 后,用 BeautifulSoup 解析结构,结合 pandas 导出成 Excel,一步到位:
注意:这里使用了
urllib.parse.urljoin来处理相对链接,确保导出的专业链接都是完整可访问的。
🛡️ exception-handling方案
📝 环境与执行
环境要求
- Python 3.8+
- Chrome/Chromium 100+(也可以由 DrissionPage 自动下载内置 Chromium)
- 依赖库一键安装:
执行命令
输出示例
📌 注意事项
- 仅供学习交流使用:请勿用于商业用途或大规模爬取,尊重学校的服务器资源。
- 瑞数版本可能更新:如果反检测 JS 失效,需要通过开发者工具观察新的检测点并及时更新。
- 代理 IP 慎用:该网站反爬更侧重特征检测,IP 封禁较少,频繁更换代理反而容易增加可疑特征。
- 数据结构变化:建议定期检查学校招生网的页面结构,及时调整 BeautifulSoup 的解析逻辑,保证数据准确抓取。

