Playwright、Selenium、DrissionPage 与 JSON 接口怎么选?

在使用 Python 编写网页采集、浏览器自动化或网页转 PDF 程序时,经常会遇到这样一个问题:到底应该选择 Playwright、Selenium,还是 DrissionPage?如果网页提供 JSON 接口,又是否还需要控制浏览器?

本文将从安装方式、运行速度、元素等待、动态网页兼容性、PDF 导出等方面进行对比,并结合"打开招标网站、定位指定区域、保存为 PDF"这一类需求给出选型建议。

说明:有时大家会把 DrissionPage 记成"jsonpage"。如果这里所说的 JsonPage 实际指 JSON 页面或 JSON 接口,那么它不是浏览器自动化框架。本文会分别介绍这两种情况。

一、Playwright 是什么?

Playwright 是微软推出的现代浏览器自动化框架,支持 Chromium、Firefox 和 WebKit。它可以用于自动化测试、网页数据采集、网页截图、生成 PDF,以及操作 iframe、弹窗和多个标签页。

Playwright 的一个重要特点是"自动等待"。例如点击按钮时,它会自动等待元素出现、可见并达到可操作状态,因此代码通常比较稳定。

Python 安装方式:

bash 复制代码
pip install playwright
playwright install chromium

简单示例:

python 复制代码
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com", wait_until="networkidle")
    page.pdf(path="网页内容.pdf", format="A4", print_background=True)
    browser.close()

如果不想额外下载 Chromium,也可以尝试调用电脑中已经安装的 Edge:

python 复制代码
browser = p.chromium.launch(channel="msedge", headless=True)

二、Selenium 是什么?

Selenium 是历史更久、生态更成熟的浏览器自动化工具。它支持 Chrome、Edge、Firefox 等浏览器,被广泛用于 Web 自动化测试和数据采集。

Python 安装方式:

bash 复制代码
pip install selenium

简单示例:

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Edge()
driver.get("https://example.com")

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".right"))
)

print(element.text)
driver.quit()

Selenium 的优势是资料多、应用广、兼容成熟,并且通常可以直接调用本机浏览器。它的不足是很多情况下需要自己编写显式等待;操作 iframe、标签页和动态页面时,代码也可能比 Playwright 更繁琐。

此外,Selenium 没有像 Playwright 那样直接、统一的网页 PDF API。生成 PDF 时通常需要调用 Chrome DevTools Protocol,或者先生成长截图,再把图片转换为 PDF。

三、DrissionPage 是什么?

DrissionPage 是一个面向 Python 用户的网页自动化工具。它兼顾浏览器控制和数据包访问,在很多采集场景中写法较简洁,也比较适合控制现有的 Chromium 内核浏览器。

安装方式:

bash 复制代码
pip install DrissionPage

简单示例:

python 复制代码
from DrissionPage import ChromiumPage

page = ChromiumPage()
page.get("https://example.com")
element = page.ele("css:.right")
print(element.text)

DrissionPage 对国内 Python 爬虫用户比较友好,常见网页操作的代码量也较少。不过,如果项目要求跨 Chromium、Firefox 和 WebKit 运行,或者需要统一且完善的测试生态,Playwright 通常更合适。

四、JSON 页面或 JSON 接口是什么?

JSON 接口不是浏览器自动化工具。它通常是网页前端在后台请求数据时使用的接口,例如:

json 复制代码
{
    "title": "某项目招标公告",
    "publishTime": "2026-08-05",
    "content": "公告正文"
}

如果只需要公告标题、发布时间、正文等结构化数据,直接请求 JSON 接口往往速度更快、资源消耗更低,也不需要启动浏览器。

python 复制代码
import requests

response = requests.get("https://example.com/api/notices", timeout=15)
response.raise_for_status()
data = response.json()
print(data)

但 JSON 接口通常只提供数据,不能保留网页原有的字体、颜色、表格排版等视觉效果。因此,如果目标是生成"与网页显示效果接近"的 PDF,仅请求 JSON 数据通常不够。

五、四种方案的核心区别

对比项 Playwright Selenium DrissionPage requests + JSON 接口
工具类型 浏览器自动化 浏览器自动化 浏览器控制与数据采集 HTTP 数据请求
浏览器支持 Chromium、Firefox、WebKit Chrome、Edge、Firefox 等 主要面向 Chromium 不需要浏览器
运行速度 较快 通常略慢 较快 最快
自动等待 完善 经常需要显式等待 使用较方便 不涉及页面元素
动态网页 支持良好 支持 支持良好 只能请求找到的接口
iframe、弹窗、标签页 API 较统一 写法相对繁琐 常用操作较简洁 不支持页面交互
元素截图 方便 支持 支持 不支持
网页转 PDF Chromium 下直接支持 通常需要 CDP 或其他处理 能力取决于具体方案 需要自行排版生成
保留网页样式 可以 可以 可以 通常不可以
生态特点 现代、功能统一 历史久、资料丰富 Python 写法简洁 轻量、高效

六、为什么网页区域转 PDF 更适合 Playwright?

假设需求如下:

  1. 打开招标网站;
  2. 点击或直接访问招标栏目;
  3. 等待动态内容加载;
  4. 找到 CSS 选择器为 .right 的区域;
  5. 将内容保存为 PDF。

这种需求中,Playwright 的优势比较明显:

  • 能自动等待动态元素;
  • 支持元素截图;
  • Chromium 页面可以直接生成 PDF;
  • 操作 iframe、弹窗和新标签页的 API 比较统一;
  • 可以使用打印 CSS 控制最终 PDF 的显示效果。

需要注意的是,Playwright 的 page.pdf() 是对页面进行打印,而不是直接把某个 DOM 元素单独输出成 PDF。如果只需要 .right 区域,可以在打印前隐藏页面中的其他元素,或者将目标区域的 HTML 提取到一个临时页面后再生成 PDF。

示意代码如下:

python 复制代码
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(channel="msedge", headless=True)
    page = browser.new_page(viewport={"width": 1440, "height": 900})
    page.goto("https://example.com", wait_until="networkidle")

    target = page.locator(".right")
    target.wait_for(state="visible")

    page.add_style_tag(content="""
        body * {
            visibility: hidden !important;
        }
        .right, .right * {
            visibility: visible !important;
        }
        .right {
            position: absolute !important;
            left: 0 !important;
            top: 0 !important;
            width: 100% !important;
        }
    """)

    page.pdf(
        path="招标信息.pdf",
        format="A4",
        print_background=True,
        margin={
            "top": "10mm",
            "right": "10mm",
            "bottom": "10mm",
            "left": "10mm"
        }
    )

    browser.close()

实际网站可能存在登录、验证码、懒加载、复杂 iframe 或反自动化策略,因此还需要根据页面结构调整等待条件和定位方式。

七、应该怎么选择?

选择 Playwright

适合以下场景:

  • 需要把网页或指定区域导出为 PDF;
  • 网页使用大量 JavaScript 动态渲染;
  • 需要稳定地操作 iframe、弹窗或多个标签页;
  • 希望减少手动编写等待代码;
  • 需要同时兼容 Chromium、Firefox 和 WebKit。

选择 Selenium

适合以下场景:

  • 已有大量 Selenium 代码;
  • 团队更熟悉 WebDriver 体系;
  • 更看重成熟生态和历史兼容性;
  • 主要进行传统 Web UI 自动化测试。

选择 DrissionPage

适合以下场景:

  • 使用 Python 编写网页采集程序;
  • 希望用较简洁的代码控制 Chromium 浏览器;
  • 希望结合页面操作与数据请求;
  • 主要面向单一 Chromium 环境,不强调跨浏览器。

选择 requests + JSON 接口

适合以下场景:

  • 只需要公告标题、日期、正文等数据;
  • 不需要模拟点击、登录或滚动;
  • 不关心网页原始排版;
  • 已经找到稳定、合法可访问的数据接口。

八、总结

没有一种工具在所有场景中都绝对最好,关键要看最终目标:

  • 要保存网页样式并生成 PDF:优先选择 Playwright。
  • 要复用成熟的传统自动化方案:选择 Selenium。
  • 要用 Python 简洁地控制 Chromium 并采集网页:可以选择 DrissionPage。
  • 只要结构化数据,不关心网页样式:直接请求 JSON 接口效率最高。

对于"打开招标网站、定位 .right 区域并生成 PDF"的需求,Playwright 通常是最省事的选择。即使不额外安装 Chromium,也可以尝试调用本机 Edge。相比之下,Selenium 同样能够完成任务,但 PDF 输出和等待逻辑一般需要编写更多代码。

选型时不要只看某个框架是否热门,还要考虑网页是否动态渲染、是否需要保留视觉样式、是否要求跨浏览器,以及项目后续的维护成本。把工具和需求对应起来,才是最稳妥的方案。

相关推荐
long3161 小时前
04-MySQL 扩展学习资料
数据库·mysql·adb
SelectDB技术团队1 小时前
Apache Doris 4.1:面向 AI & Search 的统一数据底座怎么选?向量检索 + 全文搜索 + 100MB JSON 完整能力拆解
人工智能·json·apache doris
Zldaisy3d2 小时前
连续纤维增材制造的机翼已飞上天,复材打印在低空飞行器上还需翻过几道坎?
java·前端·数据库
倔强的石头_2 小时前
连接池参数治理-HikariCP怎么配才稳
数据库
wWYy.2 小时前
Mysql:二级索引
数据库·mysql
jnrjian2 小时前
PG 导出表为excel iconv 乱码
数据库·postgresql
DLYSB_3 小时前
数据库连接池爆满导致全线宕机:我用 Go 写了个“现场声光报警器”,比钉钉快了 10 倍
数据库·golang·钉钉·报警灯
ClickHouseDB3 小时前
Postgres正则表达式性能优化:pg_re2扩展的引入与应用
数据库
艾莉丝努力练剑3 小时前
【MYSQL】MYSQL学习的一大重点:视图
android·服务器·数据库·学习·mysql·面试·视图