【爬虫】DrissionPage-5
1. 官网文档
https://www.drissionpage.cn/browser_control/tabs
2. 获取标签页对象
DrissionPage 提供了多种方法来获取和管理标签页对象:
2.1 获取最后激活的标签页
使用 Chromium
对象的 latest_tab
属性可以获取最后激活的标签页对象。
from DrissionPage import Chromiumbrowser = Chromium()
tab = browser.latest_tab # 获取最新标签页对象
注意:如果 Settings.singleton_tab_obj
设置为 True
,则 latest_tab
返回的是标签页的 tab id
。
2.2 获取指定标签页
使用 get_tab()
和 get_tabs()
方法可以根据不同条件获取指定的标签页对象。
-
按序号获取:
tab1 = browser.get_tab(1) # 获取列表中第一个标签页的对象
-
按 ID 获取:
tab2 = browser.get_tab('5399F4ADFE3A27503FFAA56390344EE5') # 获取指定 ID 的标签页对象
-
按 URL 获取:
tab3 = browser.get_tab(url='DrissionPage.cn') # 获取第一个 URL 中包含 'DrissionPage.cn' 的标签页对象 tabs = browser.get_tabs(url='DrissionPage.cn') # 获取所有 URL 中包含 'DrissionPage.cn' 的标签页对象
说明:
- 当
id_or_num
不为None
时,其他参数将失效。 title
、url
和tab_type
三个参数之间是“与”的关系。- 传入的序号与标签页的视觉顺序不一定一致,而是按照激活顺序排列。
2.3 新建标签页并获取对象
使用 new_tab()
方法可以新建一个标签页,并返回其对象。
browser.new_tab(url='') # 新建一个空白标签页
说明:
- 当传入
url
参数时,程序会根据load_mode
设置访问页面,除了none
模式外,都会等待页面加载完毕。 - 如果需要新建多个标签页且不想等待,可以批量新建不传入
url
参数的标签页,然后遍历使用get
方法。
2.4 获取点击后出现的标签页
在预期点击元素会出现新标签页时,可以使用元素的 click.for_new_tab()
方法进行点击,点击后会返回新标签页对象。
from DrissionPage import Chromiumtab = Chromium().latest_tab
tab.get('https://example.com')
ele = tab.ele('.wwads-cn wwads-horizontal').ele('tag:img')
if ele:tab2 = ele.click.for_new_tab() # 点击并获取新标签页对象tab2.set.activate()ele2 = tab2.ele('确认访问', timeout=5)if ele2:ele2.wait(.5).click()
else:print('支持开源作者,请关闭广告屏蔽功能,谢谢。')
说明:
click.middle()
方法可以使用中键点击<a>
元素,强制在新标签页打开链接,并返回新标签页对象。
3. 多标签页协同
以下示例展示了如何在一个标签页中遍历列表元素,点击打开新标签页,获取信息后关闭。
from DrissionPage import Chromiumtab = Chromium().latest_tab
tab.get('https://example.com')links = tab.eles('t:h3')
for link in links[:-1]:# 点击链接并获取新标签页对象new_tab = link.click.for_new_tab()# 等待新标签页加载new_tab.wait.load_start()# 打印标签页标题print(new_tab.title)# 关闭新打开的标签页new_tab.close()
4. 使用多例模式
默认情况下,Tab 对象是单例的,即一个标签页只有一个对象,即使重复使用 get_tab()
,获取的都是同一个对象。这主要是为了防止新手不理解机制,反复创建多个连接导致资源耗费。
如果需要允许多个 Tab 对象同时操作一个标签页,可以通过设置 Settings
来启用多例模式:
from DrissionPage.common import SettingsSettings.set_singleton_tab_obj(False)
示例:
from DrissionPage import Chromium
from DrissionPage.common import Settingsbrowser = Chromium()
browser.new_tab()
browser.new_tab()# 未启用多例:
tab1 = browser.get_tab(1)
tab2 = browser.get_tab(1)
print(id(tab1), id(tab2)) # 输出相同的 ID# 启用多例:
Settings.set_singleton_tab_obj(False)
tab1 = browser.get_tab(1)
tab2 = browser.get_tab(1)
print(id(tab1), id(tab2)) # 输出不同的 ID
输出:
2347582903056 2347582903056
2347588741840 2347588877712
可见,第一次输出两个 Tab 对象是同一个,第二次输出是独立的。