Python爬虫如何安全抓取需要短信验证码二次验证的后台数据?

雨静小哥_2378

雨静小哥_2378

2026-10-19

810人浏览

原创

必须用真实浏览器自动化完成首次登录和短信接收,因网站依赖javascript渲染、设备指纹等前端校验;验证码需通过api(如twilio/云片)预置通道接收并注入,再移交登录态至requests时须逐项设置cookie属性并同步ua等头部信息。

python爬虫如何安全抓取需要短信验证码二次验证的后台数据?

不能“安全绕过”短信验证码二次验证——这不是技术问题,而是设计约束。真正可行的路径是:把验证码环节从自动化流程中剥离,交由可控通道接收并注入,同时确保整个会话上下文不被网站识别为异常。

为什么 requests + 手动填验证码行不通

短信验证码本质是服务端对「人机分离」的强制确认:它要求操作者能访问独立通信信道(手机),且该信道与 HTTP 请求发起环境物理隔离。用 requests 模拟 POST 提交 captcha 字段,前提是验证码已知;而验证码生成、发送、过期逻辑全在服务端控制,客户端无权读取或预测。

常见错误现象包括:

  • 提交后返回 {"code":400,"msg":"验证码错误或已失效"}
  • 请求被 302 重定向到新验证码页,形成死循环
  • IP 被临时加入风控队列,后续请求直接触发滑块验证

必须用浏览器自动化完成首次登录和短信接收

只有真实浏览器环境才能满足网站对「用户行为一致性」的要求:JavaScript 渲染、事件触发、localStorage 写入、证书指纹、Canvas/WebGL 指纹等。Selenium 或 Playwright 不是为了“点按钮”,而是为了通过整套前端校验链。

实操建议:

361SCAN security check your skill python scripts
361SCAN security check your skill python scripts

扫描并分析已安装技能,用于查看指定技能目录的名称、描述和详情,或列出所有已安装的技能。

下载
  • 启动浏览器时启用 --disable-blink-features=AutomationControlled 并 patch navigator.webdriver
  • 登录流程中,等待 input[name="phone"] 可见后才输入手机号,避免因 DOM 未就绪导致空提交
  • 短信到达后,不要用 OCR 识别短信内容——延迟高、准确率低;改用 Twilio 或 云片等平台的 API 接收,通过 messages.list(date_sent_after=datetime.now()-timedelta(minutes=1)) 拉取最新条目
  • 拿到验证码后,用 driver.find_element(By.NAME, "sms_code").send_keys(code) 输入,再显式等待 document.readyState === "complete"

如何把浏览器登录态安全移交 requests

移交不是复制 Cookie 字符串那么简单。现代网站常校验 SameSite、Secure、HttpOnly 属性,还可能绑定 TLS 会话 ID 或 UA Hash。直接复用 driver.get_cookies() 返回的字典,大概率在第二步请求时被清空会话。

正确做法是:

  • 登录成功后,调用 driver.execute_script("return document.cookie") 获取原始 cookie 字符串(含所有属性)
  • 用正则提取 key=value 对,过滤掉 Path=/、Domain=.example.com 等非值字段
  • 构造 requests.Session(),用 s.cookies.set(name, value, domain="example.com") 逐个注入,而非 s.cookies.update({})
  • 首次移交请求必须带上完整 User-Agent 和 Accept 头,且与浏览器中一致;可从 driver.execute_script("return navigator.userAgent") 动态获取

短信验证码本身不可预测,但接收通道可以预置

你无法控制对方服务器何时发码、发什么码,但可以控制“谁来收”和“怎么取”。硬编码手机号+人工查收,只适用于调试;生产环境必须对接虚拟号平台。

关键细节:

  • Twilio 的 incoming_phone_numbers 需提前购买并验证,不能临时注册;国内推荐云片或容联云,API 响应更快(平均
  • 不要在每次请求前新建 client 实例,复用连接池,否则可能触发平台频率限制
  • 收到短信后立即调用 delete_message(sid),防止重复消费;部分平台需手动归档,否则 72 小时后自动清除
  • 若目标网站对同一手机号限频(如 1 小时 1 次),需准备至少 3 个号码轮换,存入 Redis 按 phone:rate_limit 计数

最易被忽略的一点:短信验证码页面往往带有隐藏字段(如 csrf_token、timestamp、sign),这些值在浏览器中由 JS 动态生成,且与当前会话强绑定。截图看 HTML 源码找不到它们,必须用 driver.execute_script("return document.querySelector('input[name=\"sign\"]').value") 实时提取——漏掉任意一个,提交必失败。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1751

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4564

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26897

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3247

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3267

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2543

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习