SessionPage 详解
本教程共 42 篇 · 第 32 篇 · 更新于 2026-07-29 · 约 7 分钟阅读
32. SessionPage 详解
本节目标:掌握 SessionPage 的创建方式和配置方法,能用 get() 和 post() 收发数据,理解它和 requests 的关系。
SessionPage 是 DrissionPage 三种页面对象之一。
它不控制浏览器,直接用 requests 库收发数据包。
没有浏览器启动的开销,请求速度比 ChromiumPage 快得多。
适合处理静态页面、API 接口、文件下载等不需要 JS 渲染的场景。
创建 SessionPage
最简单的方式,一行搞定:
from DrissionPage import SessionPage
page = SessionPage()
不传参数时,程序会从 ini 配置文件读取配置。没有 ini 文件就用内置默认配置。
用 SessionOptions 配置
需要自定义配置时,用 SessionOptions:
from DrissionPage import SessionPage, SessionOptions
# 创建配置对象,设置代理
so = SessionOptions().set_proxies(http='127.0.0.1:1080')
# 用配置创建页面对象
page = SessionPage(session_or_options=so)
不使用 ini 文件
把 read_file 设为 False,完全用代码配置:
so = SessionOptions(read_file=False)
so.set_retry(5)
page = SessionPage(so)
指定 ini 文件路径
so = SessionOptions(ini_path=r'./config1.ini')
page = SessionPage(session_or_options=so)
共享 Session 对象
多个页面对象可以共用一个 Session,共享 cookies 和连接池:
page1 = SessionPage()
session = page1.session # 获取内置 Session 对象
page2 = SessionPage(session_or_options=session) # 共享
访问网页
get() 方法
get() 和 requests 的 get() 参数基本一致,但不返回 Response 对象。
结果存在页面对象的属性里。
page = SessionPage()
page.get('https://www.baidu.com')
print(page.title) # 从属性读取结果
print(page.html)
带参数请求:
url = 'https://www.baidu.com'
headers = {'referer': 'gitee.com'}
cookies = {'name': 'value'}
proxies = {'http': '127.0.0.1:1080', 'https': '127.0.0.1:1080'}
page.get(url, headers=headers, cookies=cookies, proxies=proxies)
headers 是合并不是覆盖
传入 headers 时,里面的项会覆盖配置中的同名项,不会整个替换。没写的项保持配置里的值。
post() 方法
page = SessionPage()
# 表单数据
page.post('http://example.com', data={'username': 'admin', 'pwd': '123'})
# JSON 数据
page.post('http://example.com', json={'key': 'value'})
data 和 json 都支持 str 和 dict 两种格式:
page.post(url, data='abc=123') # 字符串
page.post(url, data={'abc': '123'}) # 字典
page.post(url, json='{"abc":"123"}') # JSON 字符串
page.post(url, json={'abc': '123'}) # JSON 字典
读取本地文件
get() 的 url 参数可以指向本地文件:
page.get(r'D:\demo.html')
print(page.html)
其他请求方式
SessionPage 只封装了 get 和 post。
需要 head、put、delete 等其他方式,直接用内置的 session 对象:
session = page.session
response = session.head('https://www.baidu.com')
print(response.headers)
获取页面信息
访问成功后,用页面对象的属性获取结果:
| 属性 | 说明 |
|---|---|
url | 当前访问的 URL |
title | 页面标题 |
html | 页面 HTML 文本 |
json | 把响应解析成 dict(API 响应很方便) |
raw_data | 原始 bytes 数据 |
user_agent | 当前 user agent |
url_available | 当前链接是否可用 |
page.get('https://www.baidu.com')
print(page.title)
print(page.html[:200])
获取 cookies
# 当前域名的 cookies
cookies = page.cookies()
# 所有域名的 cookies
cookies = page.cookies(all_domains=True)
# 包含完整信息(domain、expires 等)
cookies = page.cookies(all_info=True)
cookies 支持格式转换:
page.cookies().as_str() # 'name1=value1; name2=value2'
page.cookies().as_dict() # {'name1': 'value1', 'name2': 'value2'}
page.cookies().as_json() # JSON 字符串
获取 Response 对象
page.response 是 requests 的 Response 对象:
r = page.response
print(r.status_code)
print(r.headers)
print(r.content)
运行参数
| 属性 | 说明 | 默认值 |
|---|---|---|
timeout | 请求超时(秒) | 10 |
retry_times | 重试次数 | 3 |
retry_interval | 重试间隔(秒) | 2 |
小结
SessionPage 本质上就是给 requests 包了一层皮。
- 不用启动浏览器,速度快
- API 设计接近 requests,学习成本低
- 拿到的是静态 HTML,JS 渲染的内容处理不了
能用 SessionPage 搞定的场景,就不需要开浏览器。这是性能最优的选择。