如何解决带登录弹窗的网站爬取时requests.Session登录无效、翻页仅返回首页的问题
核心问题定位
- 登录请求目标地址错误:你将登录POST请求发送到了公开列表页
https://securities.stanford.edu/filings.html,该路径并不承载登录提交逻辑,服务器从未完成你的账号校验,会话没有绑定有效登录态。 - 分页逻辑完全不匹配网站规则:你拼接的
filings.html?page=X并非网站实际的分页路由,无论传入多少页号参数,服务器都会默认返回第一页的公开内容,这是所有分页返回结果重复的核心原因。 - 登录校验机制缺失:网站的登录请求通常携带动态CSRF校验字段,若未先从页面获取该字段值随登录表单一同提交,就算找对了登录接口也会被防护机制拦截。
分步修复操作
- 定位真实登录接口
打开浏览器开发者工具的Network面板,手动在网站弹窗完成一次真实登录流程,抓取登录动作触发的POST请求实际地址、携带的全部表单字段,替换代码中原先错误的POST目标地址。
抓取时重点确认请求中是否存在动态生成的校验字段:这类字段需要先通过GET请求访问弹窗对应的页面,从HTML源码中提取取值,和用户名、密码一并放入POST请求的data参数中提交。 - 适配真实分页规则
同样在Network面板手动点击各分页页码,抓取分页动作实际触发的请求:- 若分页是POST请求,按实际参数格式传入对应页码值,不要硬拼URL查询参数;
- 若分页是前端异步加载的接口,直接请求该异步接口地址传入页码参数,不要直接爬静态列表页。
- 校验会话登录有效性
登录请求发送完成后,单独请求一个需要登录权限的页面,通过返回内容确认是否拿到了登录态:比如检查返回的cookies中是否存在有效会话标识、页面是否显示已登录的账号信息,确认会话绑定成功后再启动分页爬取流程。
你现有代码中requests.Session复用请求上下文的逻辑是正确的,只要保证所有登录、爬取请求挂载在同一个会话对象下发起,cookies会自动携带,无需手动处理会话标识。
内容的提问来源于stack exchange,提问作者DataWizard
相关产品推荐
相关产品推荐

