SessionPage
一、SessionPage是什么?
SessionPage对象和WebPage对象的 s 模式,可用收发数据包的形式访问网页。
顾名思义,SessionPage是一个使用使用Session(requests 库)对象的页面,它使用 POM 模式封装了网络连接和 html 解析功能,使收发数据包也可以像操作页面一样便利。
并且,由于加入了本库独创的查找元素方法,使数据的采集便利性远超 requests + beautifulsoup 等组合。
获取 gitee 推荐项目第一页所有项目。
# 导入 from DrissionPage import SessionPage # 创建页面对象 page = SessionPage() # 访问网页 page.get('https://gitee.com/explore/all') # 在页面中查找元素 items = page.eles('t:h3') # 遍历元素 for item in items[:-1]: # 获取当前<h3>元素下的<a>元素 lnk = item('tag:a') # 打印<a>元素文本和href属性 print(lnk.text, lnk.link)
输出:
dromara/Sa-Token https://gitee.com/dromara/sa-token lengleng/pig https://gitee.com/log4j/pig 若依/RuoYi https://gitee.com/y_project/RuoYi macro/mall https://gitee.com/macrozheng/mall 铭飞/MCMS https://gitee.com/mingSoft/MCMS Lang/大屏数据展示模板 https://gitee.com/lvyeyou/DaShuJuZhiDaPingZhanShi 张恕征/zheng https://gitee.com/shuzheng/zheng dromara/hutool https://gitee.com/dromara/hutool 微同软件/微同商城 https://gitee.com/fuyang_lipengjun/platform keking/kkFileView https://gitee.com/kekingcn/file-online-preview MAKU/maku-boot https://gitee.com/makunet/maku-boot 卓源软件/JeeSite v5.x https://gitee.com/thinkgem/jeesite5 smallchill/SpringBlade https://gitee.com/smallc/SpringBlade 江离/Cloud-Platform https://gitee.com/geek_qi/cloud-platform 小诺/Snowy https://gitee.com/xiaonuobase/snowy
二、创建页面对象
SessionPage对象和WebPage对象的 s 模式都能收发数据包,下面介绍SessionPage的创建
2.1.SessionPage初始化参数
| 初始化参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
session_or_options |
SessionSessionOptions |
None |
传入Session对象时使用该对象收发数据包;传入SessionOptions对象时用该配置创建Session对象;为None则从 ini 文件读取 |
timeout |
float |
None |
连接超时时间,为None则从配置文件中读取 |
2.2.直接创建
这种方式代码最简洁,程序会从配置文件中读取配置,自动生成页面对象。
from DrissionPage import SessionPage page = SessionPage()
SessionPage无需控制浏览器,无需做任何配置即可使用。直接创建时,程序默认读取 ini 文件配置,如 ini 文件不存在,会使用内置配置。
2.3.通过配置信息创建
如果需要在使用前进行一些配置,可使用SessionOptions。它是专门用于设置Session对象初始状态的类,内置了常用的配置。详细使用方法见“启动配置”一节。
2.3.1.使用方法
在SessionPage创建时,将已创建和设置好的SessionOptions对象以参数形式传递进去即可。
| 初始化参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
read_file |
bool |
True |
是否从 ini 文件中读取配置信息 |
ini_path |
str |
None |
文件路径,为None则读取默认 ini 文件 |
Session对象创建后再修改这个配置是没有效果的。# 导入 SessionOptions from DrissionPage import SessionPage, SessionOptions # 创建配置对象,并设置代理信息 so = SessionOptions().set_proxies(http='127.0.0.1:1080') # 用该配置创建页面对象 page = SessionPage(session_or_options=so)
2.3.2.从指定 ini 文件创建
以上方法是使用默认 ini 文件中保存的配置信息创建对象,你可以保存一个 ini 文件到别的地方,并在创建对象时指定使用它。
from DrissionPage import SessionPage, SessionOptions # 创建配置对象时指定要读取的ini文件路径 so = SessionOptions(ini_path=r'./config1.ini') # 使用该配置对象创建页面 page = SessionPage(session_or_options=so)
2.3.3.不使用 ini 文件
可以用以下方法,指定不使用 ini 文件的配置,而把配置写在代码中:
from DrissionPage import SessionPage, SessionOptions so = SessionOptions(read_file=False) # read_file设为False so.set_retry(5) page = SessionPage(so)
三、获取页面信息
访问网页后,可使用SessionPage自身属性和方法获取页面信息。
from DrissionPage import SessionPage page = SessionPage() page.get('http://www.baidu.com') # 获取页面标题 print(page.title) # 获取页面html print(page.html)
3.1.页面信息
📌 url
- 此属性返回当前访问的 url。
- 类型:str
📌 url_available
- 此属性以布尔值返回当前链接是否可用。
- 类型:bool
📌 title
- 此属性返回当前页面title文本。
- 类型:str
📌 raw_data
- 此属性返回访问到的元素数据,即Response对象的content属性。
- 类型:bytes
📌 html
- 此属性返回当前页面 html 文本。
- 类型:str
📌 json
- 此属性把返回内容解析成 json。
- 比如请求接口时,若返回内容是 json 格式,用html属性获取的话会得到一个字符串,用此属性获取可将其解析成dict。 支持访问 *.json 文件,也支持 API 返回的json字符串。
- 类型:dict
📌 user_agent
- 此属性返回当前页面 user_agent 信息。
- 类型:str
通过访问百度搜索页面演示上面的方法:
from DrissionPage import SessionPage # 创建页面对象 page = SessionPage() # 访问页面 page.get("https://www.baidu.com") # 获取页面标题 print("Page Title:", page.title) # 获取原始数据(字节流) print("Raw Data (first 200 bytes):", page.raw_data[:200]) # 解析 JSON 数据(如果有的话). try: json_data = page.json print("JSON Data:", json_data) except ValueError as e: print("No JSON data to parse:", e) # 返回当前页面 User-Agent 信息 print("User-Agent:", page.user_agent) # 返回当前访问的 URL print("Current URL:", page.url) # 以布尔值返回当前链接是否可用 print("Is URL Available:", page.url_available) # 获取页面 HTML, 取前面200个字符 print("Page HTML (first 200 characters):", page.html[:200])
说明:
page.html[:200]: 打印页面 HTML 的前 200 个字符,方便查看页面内容的开头部分。page.raw_data[:200]: 打印原始数据的前 200 个字节。page.json: 尝试解析 JSON 数据。如果页面不是 JSON 格式的数据,page.json将返回空字典。page.user_agent: 打印请求的用户代理信息。page.url: 打印当前访问的 URL。page.url_available: 打印 URL 是否可用的布尔值。
3.2.运行参数信息
📌 timeout
- 此属性返回网络请求超时时间。默认为 10,可对其赋值设置。
- 类型:int、float
# 创建页面对象时指定 page = SessionPage(timeout=5) # 修改 timeout page.timeout = 20
📌 retry_times
- 此属性为网络连接失败时的重试次数。默认为 3,可对其赋值。
- 类型:int
# 修改重试次数 page.retry_times = 5
📌 retry_interval
- 此属性为网络连接失败时的重试等待间隔秒数。默认为 2,可对其赋值。
- 类型:int、float
# 修改重试等待间隔时间 page.retry_interval = 1.5
📌 encoding
- 此属性返回用户主动设置的编码格式。
3.3.cookies 信息
cookies()
- 此方法返回 cookies 信息。
- 类型:dict、list
参数:
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
as_dict |
bool |
False |
是否以字典方式返回结果。为True时返回由{name: value}键值对组成的dict,且all_info参数无效;为False返回 cookie 组成的list |
all_domains |
bool |
False |
是否返回所有域的 cookies,为False则指返回当前域名的 |
all_info |
bool |
False |
返回的 cookies 是否包含所有信息,False时只包含name、value、domain信息 |
返回值:
| 返回类型 | 说明 |
|---|---|
dict |
as_dict为True时,返回字典格式 cookies |
list |
as_dict为False时,返回 cookies 组成的列表 |
案例:
from DrissionPage import SessionPage page = SessionPage() page.get('https://www.baidu.com') page.get('https://gitee.com') for i in page.cookies(as_dict=False, all_domains=True): print(i)
输出:
{'name': 'BAIDUID', 'value': 'BDD0B9A46EE395357352E9E1BF54B804:FG=1', 'domain': '.baidu.com'}
{'name': 'BIDUPSID', 'value': 'BDD0B9A46EE39535D5232E346D65B101', 'domain': '.baidu.com'}
{'name': 'PSTM', 'value': '1723620595', 'domain': '.baidu.com'}
{'name': 'BDSVRTM', 'value': '2', 'domain': 'www.baidu.com'}
{'name': 'BD_HOME', 'value': '1', 'domain': 'www.baidu.com'}
{'name': 'BEC', 'value': '1f1759df3ccd099821dcf0da6feb0357', 'domain': 'gitee.com'}
3.4.内嵌对象
session 属性:
- 作用:session 属性返回当前页面对象使用的 Session 对象。Session 对象是 requests 库中的一个重要概念,它允许你在多个请求之间保持某些参数,比如 cookies、headers 等。使用 Session 对象,你可以在同一个会话中发送多个请求,这样做的好处是可以提高性能并简化代码,因为某些参数只需要设置一次。
- 含义:通过 session 属性,你可以直接访问并操作 Session 对象,以便在当前页面对象中执行更多自定义的请求操作。
response 属性:
- 作用:response 属性返回的是请求网页后生成的 Response 对象。Response 对象是 requests 库的核心对象之一,包含了服务器的响应数据,如状态码、内容、headers 等。通过 response 属性,你可以直接调用 requests 库的原生功能,获取和处理服务器的响应数据。
- 含义:通过 response 属性,你可以深入访问和处理服务器返回的原始数据,扩展或定制页面对象的功能。
完整案例:
from DrissionPage import SessionPage # 创建页面对象 page = SessionPage() # 访问页面 page.get("http://192.168.161.131:8080/EasyBuy/Home?action=index") # 访问session对象 session = page.session # ----------------------------登录操作----------------------------- # 请求头 header = {"Content-Type": "application/x-www-form-urlencoded"} # 请求体 data_load = {"loginName": "admin", "password": "123456", "action": "login"} # 可以使用session对象进行其他发送登录请求 login_request = session.post("http://192.168.161.131:8080/EasyBuy/Login", data=data_load, headers=header) # 获取相应状态码 print(login_request.status_code) # 获取相应体 print(login_request.json()) # ----------------------------退出登录----------------------------- logout_request = session.get("http://192.168.161.131:8080/EasyBuy/Login?action=loginOut") print("响应状态码:", logout_request.status_code) # 获取html文本响应 print("响应体:", logout_request.text)
输出如下:
200 {'data': '登陆成功', 'message': '操作成功', 'status': 1} 响应状态码: 200 响应体: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
四、获取元素信息
4.1.SessionElement常用属性和方法
SessionElement 是在 SessionPage 或 WebPage 对象中获取的元素对象,它提供了多种属性和方法,帮助我们获取和处理页面中的元素信息。以下是 SessionElement 的一些常用属性和方法的作用与含义:
html 属性:
- 作用:返回元素的 outerHTML,即包含元素本身及其所有子元素的完整 HTML 文本。
- 返回类型:str
inner_html 属性:
- 作用:返回元素的 innerHTML,即元素内部的 HTML 内容,不包括元素标签本身。
- 返回类型:str
tag 属性:
- 作用:返回元素的标签名(如 div, p, a 等)。
- 返回类型:str
text 属性:
- 作用:返回元素内的所有文本,已格式化,去除多余的换行符和空格。
- 返回类型:str
raw_text 属性:
- 作用:返回元素内的原始文本,保留所有空格和换行符。
- 返回类型:str
texts() 方法:
- 作用:返回元素内所有直接子节点的文本,可以选择只返回文本节点。
- 返回类型:List[str]
comments 属性:
- 作用:以列表形式返回元素内的注释。
- 返回类型:List[str]
attrs 属性:
- 作用:以字典形式返回元素所有属性及其值。
- 返回类型:dict
attr() 方法:
- 作用:返回元素某个属性的值,如 id, class 等,若属性不存在则返回 None。
- 返回类型:str 或 None
value 方法:
- 作用:返回元素的 value 值,通常用于表单元素。
- 返回类型:str
link 方法:
- 作用:返回元素的 href 或 src 属性值,若不存在则返回 None。
- 返回类型:str 或 None
page 属性:
- 作用:返回元素所在的页面对象(SessionPage 或 WebPage)。
- 返回类型:SessionPage 或 WebPage
xpath 属性:
- 作用:返回元素在页面中的 xpath 绝对路径。
- 返回类型:str
css_path 属性:
- 作用:返回元素在页面中的 css selector 绝对路径。
- 返回类型:str
4.2.完整案例
from DrissionPage import SessionPage # 创建页面对象 page = SessionPage() # 访问百度首页 page.get("https://www.baidu.com") # 获取一个示例元素,假设我们获取百度首页上的第一个 div 元素 ele = page.ele('@href=http://news.baidu.com') # 1. 打印元素的 outerHTML print("OuterHTML:") print(ele.html) # 2. 打印元素的 innerHTML print("\nInnerHTML:") print(ele.inner_html) # 3. 打印元素的标签名 print("\nTag:") print(ele.tag) # 4. 打印元素内的格式化文本 print("\nFormatted Text:") print(ele.text) # 5. 打印元素内的原始文本 print("\nRaw Text:") print(ele.raw_text) # 6. 打印元素内所有直接子节点的文本列表 print("\nTexts:") print(ele.texts()) # 7. 打印元素内的所有注释 print("\nComments:") print(ele.comments) # 8. 打印元素的所有属性及值 print("\nAttributes:") print(ele.attrs) # 9. 打印元素的 id 属性值 print("\nID Attribute:") print(ele.attr('id')) # 10. 打印元素的 value 属性值(如果存在) # print("\nValue:") # print(ele.value) # 11. 打印元素的 href 或 src 属性值 print("\nLink:") print(ele.link) # 12. 打印元素所在的页面对象 print("\nPage Object:") print(ele.page) # 13. 打印元素的 xpath 绝对路径 print("\nXPath:") print(ele.xpath) # 14. 打印元素的 css selector 绝对路径 print("\nCSS Path:") print(ele.css_path)
由于我使用的a标签作为案例演示,没有value属性,所以下面就注释掉了,否则会报错,输出如下:
OuterHTML: <a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a> InnerHTML: 新闻 Tag: a Formatted Text: 新闻 Raw Text: 新闻 Texts: ['新闻'] Comments: [] Attributes: {'href': 'http://news.baidu.com', 'target': '_blank', 'class': 'mnav c-font-normal c-color-t'} ID Attribute: None Link: http://news.baidu.com Page Object: <SessionPage url=https://www.baidu.com> XPath: /html/body/div/div/div[3]/a CSS Path: html:nth-child(1)>body:nth-child(2)>div:nth-child(4)>div:nth-child(2)>div:nth-child(3)>a:nth-child(1)
五、页面设置
在SessionPage中,set方法用于配置各种全局参数,以优化和定制页面请求的行为。以下是各个set方法的详细作用和使用示例:
1.设置重试次数
作用:指定在连接失败时的最大重试次数。
参数:times(int):重试次数。
page.set.retry_times(5)
2. 设置重试间隔
作用:设置在连接失败后重试的间隔时间(秒)。
参数:interval(float):重试间隔时间。
page.set.retry_interval(2.5)
3. 设置超时时间
作用:设置连接超时时间(秒),即请求的最大等待时间。
参数:second(float):超时时间。
page.set.timeout(20)
4. 设置网页编码
作用:指定网页内容的编码,解决编码不准确的问题。
参数:encoding(str):编码名称;set_all(bool):是否对所有对象应用该设置。
page.set.encoding('utf-8')
5. 设置 Cookies
作用:设置请求中使用的 cookies。
参数:cookies:可以是单个或多个 cookie 的各种格式。
page.set.cookies([{'name': 'a', 'value': '1'}, {'name': 'b', 'value': '2'}])
6. 清除所有 Cookies
作用:清除所有已设置的 cookies。
page.set.cookies.clear()
7. 删除特定 Cookie
作用:删除指定名称的 cookie。
参数:name(str):要删除的 cookie 名称。
page.set.cookies.remove('a')
8. 设置 Headers
作用:设置请求中的 headers,会覆盖现有的 headers。
参数:headers:字典格式或文本格式的 headers。
page.set.headers({'User-Agent': 'my-agent'})
9. 设置单个 Header
作用:设置单个 header。
参数:name(str):header 名称;value(str):header 值。
page.set.header('Authorization', 'Bearer token')
10. 设置 User-Agent
作用:设置 HTTP 请求中的 User-Agent。
参数:User-Agent 字符串。
page.set.user_agent('my-agent')
11. 设置代理
此方法用于设置代理 ip。
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
http |
str |
必填 | http代理地址 |
https |
str |
None |
https代理地址,为None时使用http的值 |
返回:None
page.set.proxies({'http': 'http://proxy', 'https': 'https://proxy'})
12. 设置认证
作用:设置请求的认证信息。
此方法用于设置认证元组或对象。
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
auth |
Tuple[str, str]HTTPBasicAuth |
必填 | 认证元组或对象 |
返回:None
from requests.auth import HTTPBasicAuth page.set.auth(('username', 'password'))
13. 设置回调方法
作用:设置在请求过程中调用的回调方法。
参数:hooks(dict):回调方法字典。
def my_hook(response): print(response.status_code) page.set.hooks({'response': my_hook})
14. 设置查询参数
作用:设置 URL 查询参数。
参数:params(dict):查询参数字典。
page.set.params({'q': 'search'})
15. 设置 SSL 验证
作用:设置是否验证 SSL 证书。
参数:on_off(bool):是否验证。
page.set.verify(True)
16. 设置 SSL 客户端证书
作用:设置 SSL 客户端证书。
参数:cert(str 或 tuple):证书文件路径或证书元组。
page.set.cert(('path/to/cert.pem', 'path/to/key.pem'))
17. 关闭连接
作用:关闭当前的连接。
page.close()
六、启动配置
6.1.创建对象
创建配置对象:
from DrissionPage import SessionOptions so = SessionOptions()
默认情况下,SessionOptions对象会从 ini 文件中读取配置信息,当指定read_file参数为False时,则以默认配置创建。
6.2.使用方法
创建配置对象后,可调整配置内容,然后在页面对象创建时以参数形式把配置对象传递进去。
from DrissionPage import SessionPage, SessionOptions # 创建配置对象(默认从 ini 文件中读取配置) so = SessionOptions() # 设置代理 so.set_proxies('http://localhost:1080') # 设置 cookies cookies = ['key1=val1; domain=****', 'key2=val2; domain=****'] so.set_cookies(cookies) # 以该配置创建页面对象 page = SessionPage(session_or_options=so)
6.3.设置的方法
set_headers()
作用:设置整个 headers 参数,传入的 headers 会覆盖原有的 headers。
参数:
- headers(dict 或 str):新的 headers 信息。
- dict:如 {'User-Agent': 'Mozilla/5.0', 'Connection': 'keep-alive'}。
- str:以文本格式传入,例如 'User-Agent: Mozilla/5.0\nConnection: keep-alive'。
返回:SessionOptions 实例。
示例:
so.set_headers({ 'User-Agent': 'Mozilla/5.0', 'Connection': 'keep-alive' }) # 或者 so.set_headers('User-Agent: Mozilla/5.0\nConnection: keep-alive')
set_a_header()
作用:设置 headers 中的一个项,修改或添加单个 header。
参数:
- name(str):header 名称。
- value(str):header 值。
返回:SessionOptions 实例。
示例:
so.set_a_header('Accept', 'text/html') so.set_a_header('Accept-Charset', 'GB2312')
remove_a_header()
作用:从 headers 中移除一个设置项。
参数:
- name(str):要删除的 header 名称。
返回:SessionOptions 实例。
示例:
so.remove_a_header('Accept')
clear_headers()
作用:清空已设置的 headers 参数。
返回:SessionOptions 实例。
示例:
so.clear_headers()
set_cookies()
作用:设置一个或多个 cookies,传入的 cookies 会覆盖之前的 cookies。
参数:
- cookies(Cookie, CookieJar, list, tuple, str, dict):cookie 信息。
返回:SessionOptions 实例。
示例:
so.set_cookies([{'name': 'key1', 'value': 'val1', 'domain': 'example.com'}, {'name': 'key2', 'value': 'val2'}])
# 或者
so.set_cookies('key1=val1; domain=example.com; key2=val2')
set_timeout()
作用:设置连接超时时间(秒)。
参数:
- second(float):连接等待时间。
返回:SessionOptions 实例。
示例:
so.set_timeout(15.0)
set_retry()
作用:设置连接失败时的重试次数和间隔。
参数:
- times(int):连接失败的重试次数。
- interval(float):重试间隔时间(秒)。
返回:SessionOptions 实例。
示例:
so.set_retry(times=3, interval=2.0)
retry_times
作用:返回连接失败时的重试次数。
类型:int
示例:
print(so.retry_times) # 输出重试次数
retry_interval
作用:返回连接失败时的重试间隔(秒)。
类型:float
示例:
print(so.retry_interval) # 输出重试间隔
set_proxies()
作用:设置代理信息。
参数:
- http(str):HTTP 代理地址。
- https(str):HTTPS 代理地址(如果为 None,则使用 HTTP 代理)。
返回:SessionOptions 实例。
示例:
so.set_proxies(http='http://127.0.0.1:1080', https='https://127.0.0.1:1080')
set_download_path()
作用:设置文件下载的默认保存路径。
参数:
path(str 或 Path):下载路径。
返回:SessionOptions 实例。
so.set_download_path('/path/to/download')
set_auth()
作用:设置认证信息(如基本认证)。
参数:
auth(tuple 或 HTTPBasicAuth):认证信息。
返回:SessionOptions 实例。
示例:
from requests.auth import HTTPBasicAuth so.set_auth(('username', 'password'))
set_hooks()
作用:设置回调方法。
参数:
hooks(dict):回调方法字典。
返回:SessionOptions 实例。
示例:
def my_hook(response): print(response.status_code) so.set_hooks({'response': my_hook})
set_params()
作用:设置查询参数。
参数:
- params(dict):查询参数字典。
返回:SessionOptions 实例。
示例:
so.set_params({'q': 'search', 'page': 1})
set_cert()
作用:设置 SSL 客户端证书。
参数:
- cert(str 或 tuple):证书文件路径或证书元组。
返回:SessionOptions 实例。
示例:
so.set_cert('path/to/cert.pem') # 或者 so.set_cert(('path/to/cert.pem', 'path/to/key.pem'))
set_verify()
作用:设置是否验证 SSL 证书。
参数:
- on_off(bool):是否验证证书。
返回:SessionOptions 实例。
示例:
so.set_verify(True)

浙公网安备 33010602011771号