DrissionPage/docs/WebPage使用方法/3.1创建页面对象.md
2023-01-27 23:54:45 +08:00

12 KiB
Raw Blame History

在入门指南的上手示例一节,我们已经初步了解如何创建页面对象,本节进一步介绍更多功能。

常用的页面对象有 3 种:

  • WebPage:整合 d 模式和 s 模式于一体的页面对象

  • ChromiumPage:单纯用于操作浏览器的页面对象

  • SessionPage:单纯用于收发数据包的页面对象

这 3 种页面对象的使用逻辑是一致的,使用时可根据实际须要选择使用。

!>注意:
如果有已经打开的同类型浏览器,请先关闭,或者按照下文“多浏览器共存”内容设置。否则会报错。

✔️ 直接创建

这种方式代码最简洁,程序会从配置文件中读取配置,自动生成页面对象。可以保持代码简洁。
在基本概念一节我们提到过,本库使用配置文件记录常用配置信息,它会自动读取配置。

# 默认以 d 模式创建页面对象
page = WebPage()

# 指定以 s 模式创建页面对象
page = WebPage('s')

# 用 ChromiumPage 创建页面对象
page = ChromiumPage()

# 用 SessionPage 创建页面对象
page = SessionPage()

默认配置文件中,程序使用 9222 端口启动浏览器,浏览器路径为'chrome'。如路径中没找到浏览器执行文件Windows 系统下程序会在注册表中查找路径。

如果都没找到,则要用下一种方式手动配置路径。

✔️ 通过配置信息创建

本库有两种管理配置信息的对象,DriverOptionsSessionOptions,分别对应控制浏览器和收发数据包的配置。须要时,可以创建相应的配置对象进行设置。

📍 DriverOptions

DriverOptions用于管理创建浏览器时的配置,内置了常用的配置,并能实现链式操作。详细使用方法见“启动配置”一节。

初始化参数 类型 默认值 说明
read_file bool True 是否从 ini 文件中读取配置信息
ini_path str None 文件路径,为None则读取默认 ini 文件

!>注意:
浏览器创建后再修改这个配置是没有效果的。

# 导入 DriverOptions
from DrissionPage import WebPage, DriverOptions

# 创建浏览器配置对象,指定浏览器路径
do = DriverOptions().set_paths(browser_path=r'D:\chrome.exe')
# 用该配置创建页面对象
page = WebPage(driver_or_options=do)

📍 SessionOptions

SessionOptions用于管理创建Session对象时的配置,内置了常用的配置,并能实现链式操作。详细使用方法见“启动配置”一节。

初始化参数 类型 默认值 说明
read_file bool True 是否从 ini 文件中读取配置信息
ini_path str None 文件路径,为None则读取默认 ini 文件

!>注意:
Session对象创建后再修改这个配置是没有效果的。

# 导入 SessionOptions
from DrissionPage import SessionPage, SessionOptions

proxies = {'http': 'http://127.0.0.1:1080',
           'https': 'http://127.0.0.1:1080'}

# 创建配置对象,不从 ini 文件读取,并设置代理信息
so = SessionOptions(read_file=False).set_proxies(proxies)
# 用该配置创建页面对象
page = SessionPage(session_or_options=so)

WebPage创建时浏览器配置和Session对象配置是可以同时使用的,不会互相影响。

page = WebPage(session_or_options=so, driver_or_options=do)

?>Tips
您可以把配置保存到配置文件以后自动读取,详见”启动配置“章节。

📍 直接指定地址创建

ChromiumPage可以直接接收浏览器地址来创建,格式为 'ip:port'。

page = ChromiumPage(addr_driver_opts='127.0.0.1:9333')

📍 使用其它 ini 文件创建

以上方法是使用默认 ini 文件中保存的配置信息创建对象,你可以保存一个 ini 文件到别的地方,并在创建对象时指定使用它。

from DrissionPage import WebPage, DriverOptinos

# 创建配置对象时指定要读取的ini文件路径
do = DriverOptinos(ini_path=r'./config1.ini')
# 使用该配置对象创建页面
page = WebPage(driver_or_options=do)

✔️ 传递控制权

当须要使用多个页面对象共同操作一个页面时,可在对象间传递驱动器。

这也可以实现多个页面对象共同控制一个浏览器。

📍 ChromiumPage传递驱动器

# 创建一个页面
page1 = ChormiumPage()
# 获取页面对象的浏览器控制器
driver = page1.driver
# 把控制器对象在第二个页面对象初始化时传递进去
page2 = ChormiumPage(driver_or_options=driver)

📍 SessionPage传递Session对象

# 创建一个页面
page1 = SessionPage()
# 获取页面对象内置的Session对象
session = page1.session
# 在第二个页面对象初始化时传递该对象
page2 = SessionPage(session_or_options=session)

📍 WebPage传递两种模式控制权

# 创建一个页面
page1 = WebPage()
# 获取页面对象的浏览器控制器
driver = page1.driver
# 获取页面对象的Session对象
session = page1.session
# 把两个控制器对象在第二个页面对象初始化时传递进去
page2 = WebPage(driver_or_options=driver, session_or_options=session)

✔️ 接管已打开的浏览器

页面对象创建时,只要指定的 ip:port 中已有浏览器在运行,就会直接接管。无论浏览器是下面哪种方式启动的。

📍 用程序启动的浏览器

默认情况下,创建浏览器页面对象时会自动启动一个浏览器。只要这个浏览器不关闭,下次运行程序时会接管同一个浏览器继续操作(配置的 ip:port 信息不变)。

这种方式极大地方便了程序的调试,使程序不必每次重新开始,可以单独调试某个功能。

from DrissionPage import ChromiumPage

# 创建对象同时启动浏览器,如果浏览器已经存在,则接管它
page = ChromiumPage()  

📍 手动打开的浏览器

如果须要手动打开浏览器再接管,可以这样做:

  • 右键点击浏览器图标,选择属性

  • 在“目标”路径后面加上 --remote-debugging-port=端口号(注意最前面有个空格)

  • 点击确定

  • 在程序中的浏览器配置中指定接管该端口浏览器

文件快捷方式的目标路径设置:

D:\chrome.exe --remote-debugging-port=9222

程序代码:

from DrissionPage import WebPage, DriverOptions

do = DriverOptions().set_paths(local_port=9222)
page = WebPage(driver_or_options=do)

!> 注意:
接管浏览器时只有local_portdebugger_address参数是有效的。

📍 bat 文件启动的浏览器

可以把上一种方式的目标路径设置写进 bat 文件Windows系统运行 bat 文件来启动浏览器,再用程序接管。

新建一个文本文件,在里面输入以下内容(路径改为自己电脑的):

"D:\chrome.exe" --remote-debugging-port=9222

保存后把后缀改成 bat然后双击运行就能在 9222 端口启动一个浏览器。程序代码则和上一个方法一致。

✔️ 多浏览器共存

📍 用程序启动的浏览器

如果想要同时操作多个浏览器,或者自己在使用其中一个上网,同时控制另外几个跑自动化,就须要给这些被程序控制的浏览器设置单独的端口用户文件夹,否则会造成冲突。具体用DriverOptions对象进行设置,示例如下:

from DrissionPage import ChromiumPage, DriverOptions

# 创建多个配置对象,每个指定不同的端口号和用户文件夹路径
do1 = DriverOptions().set_paths(local_port=9111, user_data_path=r'D:\data1')
do2 = DriverOptions().set_paths(local_port=9222, user_data_path=r'D:\data2')

# 创建多个页面对象
page1 = ChromiumPage(driver_or_options=do1)
page2 = ChromiumPage(driver_or_options=do2)

# 每个页面对象控制一个浏览器
page1.get('https://www.baidu.com')
page2.get('http://www.163.com')

?>Tips
每个浏览器都要设置独立的端口号和用户文件夹,二者缺一不可。

📍 bat 文件启动的浏览器

如果要接管多个 bat 文件打开的浏览器,每个浏览器的参数都要添加--remote-debugging-port--user-data-dir参数。浏览器路径则是一样的。示例如下:

bat 文件1

"D:\chrome.exe" --remote-debugging-port=9111 --user-data-dir=D:\data1

bat 文件2

"D:\chrome.exe“ --remote-debugging-port=9222 --user-data-dir=D:\data2

程序代码:

from DrissionPage import ChromiumPage, DriverOptions

do1 = DriverOptions().set_paths(local_port=9111)
do2 = DriverOptions().set_paths(local_port=9222)

page1 = ChromiumPage(addr_driver_opts=do1)
page2 = ChromiumPage(driver_or_options=do2)

✔️ 页面对象初始化 API

📍 ChromiumPage

ChroumiumPage对象纯粹用于操作浏览器,不能切换模式。一个该对象对应的是浏览器上一个标签页。

初始化参数 类型 默认值 说明
addr_driver_opts str
ChromiumDriver
DriverOptions
None 浏览器启动配置或接管信息。传入' ip:port' 字符串或ChromiumDriver时接管浏览器;传入DriverOptions时按配置启动浏览器;为None时使用配置文件配置启动浏览器
tab_id str None 要控制的标签页id用于 d 模式,为None则控制激活的标签页
timeout float None 整体超时时间,为None则从配置文件中读取

📍 SessionPage

SessionPage对象纯粹用于收发数据包,不能切换模式,产生的元素对象为SessionElement

初始化参数 类型 默认值 说明
session_or_options Session
SessionOptions
None 传入Session对象时使用该对象收发数据包;传入SessionOptions对象时用该配置创建Session对象
timeout float None 连接超时时间,为None则从配置文件中读取

📍 WebPage

WebPage对象封装了常用的网页操作,并实现在浏览器和 requests 两种模式之间的切换。

初始化参数 类型 默认值 说明
mode str 'd' 启动时的模式,只能传入'd''s'
timeout float None 整体超时时间,为None则从配置文件中读取
tab_id str None 要控制的标签页id用于 d 模式,为None则控制激活的标签页
driver_or_options ChromiumDriver
DriverOptions
bool
None 浏览器控制对象或浏览器启动配置对象;为None时使用 ini 文件配置;为False时不读取 ini 文件。
session_or_options Session
SessionOptions
bool
None 收发数据包对象或Session启动配置对象;为None时使用 ini 文件配置;为False时不读取 ini 文件。

说明:

driver_or_optionssession_or_options传入ChromiumDriverSession对象时,可在多个页面对象间传递控制权。