【爬虫】DrissionPage-5

发布于:2025-05-18 ⋅ 阅读:(20) ⋅ 点赞:(0)
1. 官网文档

https://www.drissionpage.cn/browser_control/tabs

2. 获取标签页对象

DrissionPage 提供了多种方法来获取和管理标签页对象:

2.1 获取最后激活的标签页

使用 Chromium 对象的 latest_tab 属性可以获取最后激活的标签页对象。

from DrissionPage import Chromium

browser = 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 时,其他参数将失效。
  • titleurltab_type 三个参数之间是“与”的关系。
  • 传入的序号与标签页的视觉顺序不一定一致,而是按照激活顺序排列。
2.3 新建标签页并获取对象

使用 new_tab() 方法可以新建一个标签页,并返回其对象。

browser.new_tab(url='')  # 新建一个空白标签页

说明

  • 当传入 url 参数时,程序会根据 load_mode 设置访问页面,除了 none 模式外,都会等待页面加载完毕。
  • 如果需要新建多个标签页且不想等待,可以批量新建不传入 url 参数的标签页,然后遍历使用 get 方法。
2.4 获取点击后出现的标签页

在预期点击元素会出现新标签页时,可以使用元素的 click.for_new_tab() 方法进行点击,点击后会返回新标签页对象。

from DrissionPage import Chromium

tab = 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 Chromium

tab = 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 Settings

Settings.set_singleton_tab_obj(False)

示例

from DrissionPage import Chromium
from DrissionPage.common import Settings

browser = 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 对象是同一个,第二次输出是独立的。