爬虫怎么处理登录后的动态数据 利Session保持授权令牌案例|Duuu笔记
面向高级开发者的Python指南,涵盖
登录后401/403需依次检查:登录接口是否真成功(200+success标识)、Cookie是否写入、CSRF Token是否携带、JS渲染数据是否绕过、Cookie是否过期或绑定校验。
登录后请求 401 或 403?检查
Session
是否真的带上了 Cookie
很多同学用
requests.Session()
登录后,直接拿它去请求目标页面,结果返回 401 或 403 —— 表面看代码没错,其实是登录接口根本没成功,或者登录成功了但响应里没写入 Cookie。
先确认登录接口是否真返回了
200
,且响应体里有类似
"success": true
这种标识,别只看状态码就以为登录成了
调用
session.post()
后立刻打印
session.cookies
,看有没有新增类似
sessionid
、
token
、
auth_token
的键值
有些网站用前端 JS 动态设置 Cookie(比如通过
document.cookie
),这种
requests
根本捕获不到,得换方案
登录成功但动态接口返回空数据?可能是 CSRF Token 没传或过期
尤其在 Django、Flask 或 Spring Security 体系下,登录后发 POST/PUT 请求常被拦截,错误不一定是 401,而是 403 或直接返回空 JSON —— 很大概率是缺了
X-CSRFToken
或
CSRF-Token
请求头。
先从登录成功后的 HTML 页面源码里搜
csrf_token
、
csrfmiddlewaretoken
,或看响应头里有没有
X-CSRFToken
把拿到的 token 值塞进下个请求的 headers:
{"X-CSRFToken": "xxx"}
,注意大小写和 header 名要跟服务端要求一致
有些站点 token 一次一换,比如每次 GET 页面都会刷新,那就不能缓存 token,得每次从响应中重新提取
用
Session
仍拿不到动态渲染内容?说明数据压根不是服务端吐的
如果目标数据是靠 JS 执行后才插入 DOM(比如 Vue 渲染的列表、React 的 useEffect 请求),那
requests.Session()
再怎么保持会话也白搭——它不执行 JS,看不到最终结果。
打开浏览器开发者工具,切到 Network 面板,手动登录后点触发数据加载的按钮,找那个返回 JSON 的 XHR/Fetch 请求,这才是真实数据入口
复制该请求的完整 cURL,用
curlconverter
转成 Python 代码,重点看它用了哪些 headers(比如
Referer
、
X-Requested-With
)和 cookies
别盲目模仿浏览器所有 headers,但
User-Agent
、
Accept
、
Referer
这三个经常是反爬校验点,漏一个就可能被拒
登录态突然失效?留意
Expires
和
HttpOnly
Cookie 属性
Session
对象会自动管理 Cookie,但它不会主动刷新过期时间。如果登录态几小时后失效,大概率是服务端下发的 Cookie 带了
Expires
或
Max-Age
,而你的脚本没做续期。
Action Figure AI
借助Action Figure AI的先进技术,瞬间将照片转化为定制动作人偶。
下载
“
Python免费学习笔记(深入)
”;
用
session.cookies
查看关键 Cookie 的
expires
字段,确认是否已过期;
HttpOnly
的 Cookie 无法被 JS 读取,但
requests
能正常发送,不用额外处理
如果接口提供
/api/refresh
或类似心跳接口,定期调用它,让服务端延长 Cookie 有效期
别把整个
session.cookies
序列化后长期保存再反序列化复用——部分站点会对 Cookie 做绑定校验(比如绑定 IP 或 UA),换环境就失效
真正麻烦的从来不是“怎么保持登录”,而是搞清这个登录态到底依赖哪些隐式条件:是 Cookie、Header、时间戳、还是某个前端生成的签名。漏掉任意一个,
Session
就只是个空壳。
