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 Session
SessionOptions
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])

说明:

  1. page.html[:200]: 打印页面 HTML 的前 200 个字符,方便查看页面内容的开头部分。
  2. page.raw_data[:200]: 打印原始数据的前 200 个字节。
  3. page.json: 尝试解析 JSON 数据。如果页面不是 JSON 格式的数据,page.json 将返回空字典。
  4. page.user_agent: 打印请求的用户代理信息。
  5. page.url: 打印当前访问的 URL。
  6. 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时只包含namevaluedomain信息

返回值:

返回类型说明
dict as_dictTrue时,返回字典格式 cookies
list as_dictFalse时,返回 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 是在 SessionPageWebPage 对象中获取的元素对象,它提供了多种属性和方法,帮助我们获取和处理页面中的元素信息。以下是 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)
posted @ 2019-10-29 14:56  酒剑仙*  阅读(788)  评论(0)    收藏  举报