为什么使用requests.session登录Sparkhire后访问其他页面会被强制登出?
问题原因分析
代码逻辑错误
你当前代码构造BeautifulSoup时传入了会话对象s的content属性,会话本身不存在该属性,应该传入GET请求返回的响应对象r的content,该错误会导致解析内容失败,但不是触发会话登出的核心原因。CSRF Token与会话不匹配
绝大多数网站的_token(CSRF校验令牌)是和当前访问会话的Cookie绑定的,如果你通过外部的token_scraper模块获取的Token,没有和当前代码里的s会话绑定,会导致登录请求校验不通过,会话直接被重置。正确做法是使用当前会话请求登录页,从返回内容中提取_token,保证令牌和会话Cookie匹配。缺少必要的请求头
网站会校验请求的User-Agent、Referer等头信息来识别爬虫,你当前的请求没有携带任何自定义头,很容易被风控拦截,导致会话失效。未校验登录请求的响应结果
你没有判断POST登录请求的返回状态和内容,无法确认登录是否真的成功,有可能登录请求本身就被拦截,后续访问受限页面自然会被跳转到登录页。
修正后代码示例
from bs4 import BeautifulSoup import requests login_url = 'https://www.sparkhire.com/login' interviews_url = 'https://www.sparkhire.com/company/interviews' # 初始化会话并配置统一请求头 with requests.session() as s: s.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": login_url }) # 用当前会话请求登录页,提取绑定该会话的_token login_page_resp = s.get(login_url) soup = BeautifulSoup(login_page_resp.content, 'html.parser') token = soup.find('input', {'name': '_token'})['value'] payload = { '_token': token, 'email': 'censored', 'password': 'censored' } # 发送登录请求,校验登录结果 login_resp = s.post(login_url, data=payload, allow_redirects=True) if login_resp.status_code not in (200, 301, 302): print(f"登录失败,状态码:{login_resp.status_code}") exit() # 访问目标页面 r = s.get(interviews_url) result_soup = BeautifulSoup(r.content, 'html.parser') print(result_soup)
内容的提问来源于stack exchange,提问作者user17441867
相关产品推荐
相关产品推荐

