You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么使用requests.session登录Sparkhire后访问其他页面会被强制登出?

问题原因分析

  1. 代码逻辑错误
    你当前代码构造BeautifulSoup时传入了会话对象s的content属性,会话本身不存在该属性,应该传入GET请求返回的响应对象r的content,该错误会导致解析内容失败,但不是触发会话登出的核心原因。

  2. CSRF Token与会话不匹配
    绝大多数网站的_token(CSRF校验令牌)是和当前访问会话的Cookie绑定的,如果你通过外部的token_scraper模块获取的Token,没有和当前代码里的s会话绑定,会导致登录请求校验不通过,会话直接被重置。正确做法是使用当前会话请求登录页,从返回内容中提取_token,保证令牌和会话Cookie匹配。

  3. 缺少必要的请求头
    网站会校验请求的User-Agent、Referer等头信息来识别爬虫,你当前的请求没有携带任何自定义头,很容易被风控拦截,导致会话失效。

  4. 未校验登录请求的响应结果
    你没有判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:24:03