requests.get() 悄无声息跳转到 login.html 是因默认 allow_redirects=true,自动跟随 302/301 重定向;关闭该选项(allow_redirects=false)可捕获原始响应状态码及 location 头,暴露验证跳转真实路径。

为什么 requests.get() 会悄无声息地跳转到 login.html?
requests 默认开启 allow_redirects=True,遇到 302 或 301 响应时自动跟随重定向。很多反爬网站(如知乎、豆瓣)会在首次请求后返回 302,跳转到带验证码或 JS 挑战的验证页(比如 /check?next=xxx 或 /verify?r=xxx),而你拿到的响应内容其实是那个验证页的 HTML,不是目标数据。
这不是 bug,是 requests 的默认行为;但对爬虫来说,它掩盖了“被拦截”这个关键信号。
- 检查响应 URL 是否和请求 URL 不一致:
resp.url != original_url - 检查状态码是否为
302或301(哪怕你没开重定向,服务器也可能返回) - 检查响应 body 是否包含典型验证关键词,比如
"verify"、"captcha"、"checkpoint"、"请完成验证"
如何让重定向“停下来”,看清真实响应?
把 allow_redirects=False 加进 requests.get() 调用里,强制停在第一次响应。这样你能拿到原始 302 响应头里的 Location 字段,判断是不是被导去验证页。
resp = requests.get(url, allow_redirects=False)
if resp.status_code in (301, 302):
location = resp.headers.get("Location", "")
if "verify" in location or "check" in location or "captcha" in location:
print("触发验证,Location:", location)
# 此处可介入人工识别或换代理/UA/Session
注意:关闭重定向后,resp.text 是空的(HTTP spec 规定 3xx 响应体可为空),别再拿它解析数据。
- 必须读
resp.headers["Location"]判断跳转目标 - 某些站点用
Refresh头或 meta refresh 实现跳转,这种不会出现在Location里,需额外解析 HTML - 如果后续要模拟浏览器行为继续跳,得手动构造新请求,不能靠 requests 自动跟
Session 保持 + 请求头伪造能绕过基础重定向吗?
多数验证重定向依赖会话状态(cookie)或客户端特征。单纯加 User-Agent 很难生效,但组合使用 Session 对象 + 合理 headers + 首次请求携带必要 cookie,有时能避免初始跳转。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
s = requests.Session()
s.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
})
resp = s.get(url, allow_redirects=False) # 注意仍要关重定向来观察
关键点不在 headers 本身,而在于 Session 能自动管理 Set-Cookie,让第二次请求带上服务端发的 session token —— 有些站点只对“无 cookie 的裸请求”做验证跳转。
- 不要硬编码 cookie,用
s.cookies.set()显式注入不如让服务端自己设 - 若目标站依赖 Referer 防盗链,漏掉
Referer可能直接 302 到登录页 - 某些站点校验
Sec-Fetch-*头,requests 默认不发,但加了反而可能触发更严检测
遇到 /verify?token=xxx 这类动态验证页怎么办?
这类页面通常要求执行 JS(如调用 __cxa())、提交加密 form、或等待 iframe 加载完成。requests 无法执行 JS,所以拿到这个 URL 后基本就该切换策略了。
别尝试用正则从 HTML 里抠 token 然后手拼请求 —— token 往往绑定时间、IP、User-Agent 三元组,且 signature 有校验逻辑,几乎必失败。
- 优先考虑用
playwright或selenium启动真实浏览器,等 JS 渲染完成再取源码 - 若必须用 requests,查该站是否有公开 API(比如移动端接口、GraphQL endpoint),它们常绕过前端验证逻辑
- 部分小站的验证页其实只是“障眼法”,背后仍走常规接口,可抓包对比 PC 端和 App 端请求差异
真正麻烦的不是重定向本身,而是重定向背后那套动态生成、绑定上下文的验证机制 —— 它不给你留“补参数就能过”的缝隙。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










