在使用 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?
假设需求如下:
- 打开招标网站;
- 点击或直接访问招标栏目;
- 等待动态内容加载;
- 找到 CSS 选择器为
.right的区域; - 将内容保存为 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 输出和等待逻辑一般需要编写更多代码。
选型时不要只看某个框架是否热门,还要考虑网页是否动态渲染、是否需要保留视觉样式、是否要求跨浏览器,以及项目后续的维护成本。把工具和需求对应起来,才是最稳妥的方案。