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

如何用Python Requests维持会话Cookie并模拟多标签页访问?

解决requests模拟多标签页会话失效问题

你的问题核心是网站的会话验证机制不仅依赖Cookie,还关联了主页的活跃状态或上下文信息,导致单独请求报表页时会话失效。以下是几种针对性的解决方法:

1. 从主页提取必要验证参数

很多网站会在主页嵌入CSRF Token或会话密钥,请求报表页时必须携带这些参数才能通过验证。步骤如下:

  • 访问主页后解析页面内容,提取隐藏的验证参数
  • 请求报表页时将参数通过URL、表单或请求头传递

示例代码:

import requests
from bs4 import BeautifulSoup

session = requests.Session()

# 登录操作
payload = {'username':'username_here','password':'password_here'}
session.post("http://website.com/login", data=payload)

# 访问主页并提取CSRF Token
home_resp = session.get("https://website.com/home/home-page")
soup = BeautifulSoup(home_resp.text, 'html.parser')
# 根据实际页面结构调整提取方式,比如从meta标签或隐藏input获取
csrf_token = soup.find('meta', attrs={'name': 'csrf-token'})['content']

# 携带Token请求报表页
# 方式1:作为URL参数
report_resp = session.get("https://website.com/Reports/1234", params={'csrf_token': csrf_token})
# 方式2:添加到请求头
# session.headers.update({'X-CSRF-Token': csrf_token})
# report_resp = session.get("https://website.com/Reports/1234")

2. 补充必要请求头

部分网站会检查请求的Referer字段,确保请求来自主页;或者需要特定的User-Agent模拟真实浏览器。可以在Session中设置持久化请求头:

示例代码:

session = requests.Session()

# 设置模拟浏览器的请求头
session.headers.update({
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Referer': 'https://website.com/home/home-page'  # 指定请求来自主页
})

# 登录并访问主页
payload = {'username':'username_here','password':'password_here'}
session.post("http://website.com/login", data=payload)
session.get("https://website.com/home/home-page")

# 请求报表页,此时已携带必要头信息
report_resp = session.get("https://website.com/Reports/1234")

3. 模拟心跳请求保持会话活跃

如果网站需要主页持续活跃才能维持会话,可以在请求报表页前重新访问主页或调用网站的心跳接口,刷新会话状态:

示例代码:

import requests
import time

session = requests.Session()

# 登录并访问主页
payload = {'username':'username_here','password':'password_here'}
session.post("http://website.com/login", data=payload)
session.get("https://website.com/home/home-page")

# 模拟用户停留后刷新主页,保持会话活跃
time.sleep(1)
session.get("https://website.com/home/home-page")

# 请求报表页
report_resp = session.get("https://website.com/Reports/1234")

4. 使用浏览器自动化工具(Selenium)

如果网站依赖浏览器端的上下文(如localStorage、sessionStorage或标签页间的WebSocket通信),requests无法模拟这种环境,此时需要用Selenium直接操作浏览器,真实模拟多标签页场景:

示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化浏览器
driver = webdriver.Chrome()

# 登录流程
driver.get("http://website.com/login")
driver.find_element(By.NAME, "username").send_keys("username_here")
driver.find_element(By.NAME, "password").send_keys("password_here")
driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()

# 等待主页加载完成
WebDriverWait(driver, 10).until(EC.url_contains("home-page"))

# 打开新标签页访问报表页
driver.execute_script("window.open('https://website.com/Reports/1234');")
# 切换到新标签页
driver.switch_to.window(driver.window_handles[1])

# 获取报表内容
report_content = driver.page_source

# 关闭浏览器
driver.quit()

内容的提问来源于stack exchange,提问作者BSIncorporated

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:15:36