Puppeteer 与 Selenium 对比

这份终极指南将涵盖两个库的起源、主要功能/特点,最重要的是:如何选择最适合您业务的选项。
2 min read
Puppeteer 与 Selenium
信息图:Selenium-与-Puppeteer-比较
信息图:Selenium-与-Puppeteer-比较

Puppeteer Selenium 都是广泛使用的开源库,用于自动化浏览器交互,从而提取大量数据。Puppeteer 通过拦截和翻译 Chrome 的网络请求来向网络引擎发送命令,而 Selenium 通过接收命令并将其传递给浏览器来与网络应用程序进行交互。

本文将介绍这两种工具的主要区别,帮助你决定哪种工具最适合你的使用场景。

什么是 Puppeteer?

Puppeteer 是一个开源的 Node.js 库,主要用于控制 Chrome 或 Chromium 浏览器,通过高层 API 利用 DevTools 协议进行控制。它还支持与该协议兼容的其他浏览器。

Puppeteer 被广泛用于各种任务,包括自动化测试、页面截图、PDF 生成、Chrome 扩展测试、搜索引擎优化(SEO)内容渲染和网络抓取。

什么是 Selenium?

Selenium 是一个开源框架,主要用于自动化 web 应用程序测试。它利用 WebDriver 协议在测试过程中模拟真实用户交互。Selenium 包含 Selenium IDE、Selenium WebDriver 和 Selenium Grid 等工具,能够自动化 web 应用程序中的复杂场景。

Puppeteer 与 Selenium:主要区别

现在你对每种工具都有了一些了解,让我们从以下几个方面对它们进行比较:

浏览器支持

Puppeteer 主要用于 Chromium 浏览器(如 Brave 和 Chrome),使你可以直接访问高级的 Chromium 浏览器功能和 API。此外,其 Chromium 集成使其与 web 标准高度兼容,确保测试脚本在不同环境中的一致性。然而,Puppeteer 对其他浏览器的功能和支持有限,与 Firefox 和 Safari 不兼容。

相反,Selenium 支持多种浏览器,包括 Chrome、Firefox、Safari 和 Edge,确保更广泛的覆盖范围和更全面的测试场景。然而,这种多样性可能会带来挑战,因为每个浏览器解释和显示 web 内容的方式不同,实现不同浏览器间的一致同步需要额外的时间和努力。

生态系统

Puppeteer 的生态系统正在快速增长,其使用率从 2019 年的 27% 增加到 2021 年的 37%。它的下载量在过去两年中增加了 101%,目前下载量为 560 万次。但由于其在 2018 年才问世,相较于 2004 年发布的 Selenium 还不够成熟。

Selenium 提供了一个强大的 web 自动化工具和框架生态系统。例如,Selenium Grid 使得在多台机器上并行运行测试变得更加容易,Selenium IDE 的录制和回放功能加快了测试开发和执行。Selenium 还提供插件和与其他工具的集成,扩展了其在各种场景中的功能和可用性。这巩固了它作为广泛测试解决方案的首选地位。

语言支持

Puppeteer 主要为 Node.js 和 JavaScript 环境设计,使其成为使用这些技术栈的开发人员的明显选择。它还可以在 web 页面内运行 JavaScript,使其能够有效地与动态 web 页面交互,并为 JavaScript 密集型网站预渲染内容以显示其最终状态。

相反,Selenium 支持多种编程语言,包括 Java、Python、C#、Ruby 和 JavaScript。这种支持扩展了其在各种开发者社区中的吸引力,并使其容易集成到不同的开发和测试环境中。

Puppeteer 与 Selenium 的设置复杂性

Puppeteer 自带 Chromium,因此不需要单独安装驱动程序。然而,将其设置并集成到现有工作流程中需要对 JavaScript 和 Node.js 环境及其依赖项有良好的掌握。

尽管如此,Puppeteer 的设置仍然比 Selenium 简单。使用 Selenium,需要安装 Selenium 库和各种浏览器的驱动程序,并确保它们都兼容,这对于初学者来说可能既复杂又具有挑战性。这也使得 Selenium 难以与现有项目和开发环境集成。

速度和资源使用

Puppeteer 尤其在无头模式下通常被认为更快、更高效,因为它进行了资源优化。然而,安装 Puppeteer 时会包含整个 Chromium 浏览器,导致占用空间大。这会减慢安装速度,在资源受限的环境中运行多个实例时可能会影响整体性能。

相比之下,Selenium 可能较慢且需要更多资源,这部分是因为它使用 WebDriver 与浏览器实例通信所带来的额外开销。这再加上 Selenium 测试在不同浏览器中的实际运行时间,会消耗大量系统资源并引入性能开销。你还需要定期维护脚本,特别是对于行为频繁变化的动态 web 应用程序,这可能耗时且增加维护开销。

社区和文档

Puppeteer 由 Google 维护,拥有良好的文档和不断增长的用户群,而 Selenium 拥有一个庞大且活跃的社区,贡献了新功能的开发。这个社区已经非常成熟,拥有广泛的文档、用户论坛和第三方教程,使新用户更容易学习和解决问题。这给 Selenium 带来了显著的优势。

跨浏览器测试

Puppeteer 对 Chromium 浏览器的限制使其不适合跨浏览器测试。尽管 Puppeteer 提供了其他浏览器的扩展,但它缺乏 Selenium 内置的广度和深度能力。这限制了跨浏览器测试,可能导致开发人员忽略浏览器特定的问题,从而导致测试场景不能准确反映多样的真实用户环境。

Selenium 具有广泛的浏览器支持,是进行跨浏览器测试的最佳选择,并提供更好的开箱即用的并行测试支持,使其在多样的 web 环境中确保兼容性和功能一致性。

类别 Puppeteer Selenium
浏览器支持 优化用于 Chromium 浏览器(Chrome,Brave);对其他浏览器如 Firefox 和 Safari 支持有限 支持多种浏览器(Chrome、Firefox、Safari 和 Edge)
生态系统 生态系统正在增长,工具和框架较少;2018 年发布 成熟的生态系统,拥有丰富的工具和框架;2004 年发布
语言支持 主要为 JavaScript 设计 支持多种编程语言(Java、Python、C#、Ruby 和 JavaScript)
设置复杂性 设置简单;需要 JavaScript 知识 设置更复杂;需要安装 Selenium 库和浏览器驱动程序
速度和资源使用 更快更高效,尤其在无头模式下;由于捆绑了 Chromium,空间占用大 由于 WebDriver 的开销,可能较慢且需要更多资源
社区和文档 良好的文档和较小的社区 庞大且活跃的社区,拥有丰富的文档和用户论坛
跨浏览器测试 仅限于 Chromium 浏览器,不适合广泛的跨浏览器测试 适用于跨平台和设备的跨浏览器测试

介绍 Bright Data 抓取浏览器

无论你选择 Selenium 还是 Puppeteer,Bright Data 抓取浏览器都可以帮助你克服网站访问限制,简化数据收集过程。

Bright Data 是一个网络数据平台,提供获奖的代理网络、强大的网络抓取工具和可下载的数据集。其抓取解决方案之一是抓取浏览器,为浏览器提供网络解除封锁自动化,允许你访问限制自动化浏览器活动的网站。它可以与 Puppeteer 和 Selenium 集成,通过代理轮换、CAPTCHA 解决和浏览器指纹等功能提高网络抓取能力。

将 Bright Data 抓取浏览器与 Puppeteer 集成

将 Bright Data 抓取浏览器与 Puppeteer 集成非常简单。你只需修改 Puppeteer 脚本以通过 Bright Data 代理服务器传输流量。以下代码片段显示了如何做到这一点。首先,确保设置好 JavaScript 环境和代码编辑器(如 Visual Studio Code),然后通过 npm i puppeteer-core 安装 puppeteer-core


const puppeteer = require('puppeteer-core');
const AUTH = 'USER:PASS';
const SBR_WS_ENDPOINT = `wss://${AUTH}@brd.superproxy.io:9222`;
async function main() {
 console.log('Connecting to Scraping Browser...');
 const browser = await puppeteer.connect({
 browserWSEndpoint: SBR_WS_ENDPOINT
 });
 try {
 console.log('Connected! Navigating...');
 const page = await browser.newPage();
 await page.goto('https://brightdata.com/' { timeout: 2 * 60 * 1000 });
 // ... perform other actions
 } finally {
 await browser.close();
 }
}
if (require.main === module) {
 main().catch(err => {
 console.error(err.stack || err);
 process.exit(1);
 });
}
 

在这个代码块中,你导入 puppeteer-core 库。然后设置身份验证凭据和 Bright Data 抓取浏览器的 WebSocket 端点。你通过 puppeteer.connect 与抓取浏览器建立连接,用 browser.newPage 打开一个新页面,通过 page.goto 导航到一个 URL,并用 browser.close 关闭浏览器。

将 Bright Data 抓取浏览器与 Selenium 集成

将 Bright Data 抓取浏览器与 Selenium 集成非常简单。你只需通过指定 Bright Data 提供的代理 IP 和端口来配置 Selenium WebDriver,如下代码所示。首先,确保安装 Python 和代码编辑器(如 Visual Studio Code),然后通过 pip 命令 pip3 install selenium 安装 Selenium:


from selenium.webdriver import Remote, ChromeOptions
from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection
AUTH = 'USER:PASS'
SBR_WEBDRIVER = f'https://{AUTH}@brd.superproxy.io:9515'
def main():
 print('Connecting to Scraping Browser...')
 sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, 'goog', 'chrome')
 with Remote(sbr_connection, options=ChromeOptions()) as driver:
 print('Connected! Navigating...')
 driver.get('https://brightdata.com/')
 # ... perform other actions
if __name__ == '__main__':
 main()
 

在这个代码块中,你导入了 Selenium 所需的所有模块。然后定义 AUTHSBR_WEBDRIVER,这是 Bright Data 的身份验证详情和 Selenium WebDriver URL。

你使用 ChromiumRemoteConnection 配置与抓取浏览器的连接,使用 RemoteChromeOptions 创建一个远程 Selenium 驱动实例,并通过 driver.get 导航到指定的 URL。你使用 with 关键字在上下文管理器中完成这些操作,以确保在完成指定任务后关闭驱动。

结论

本文比较了 Puppeteer 和 Selenium 两种流行的 web 自动化工具。

Puppeteer 优化用于 Chromium 浏览器,设置简单,使其成为 JavaScript 中心环境和快速开发的理想选择。相反,Selenium 由于其广泛的浏览器兼容性和对多种编程语言的支持,更适合复杂的跨浏览器测试。

如果你需要在 Chromium 浏览器中进行快速高效的测试,那么 Puppeteer 是你的选择。然而,如果你希望在多种浏览器和编程语言中测试各种 web 环境和项目,Selenium 则是更好的选择。

无论你决定使用 Puppeteer 还是 Selenium,Bright Data 抓取浏览器 都可以帮助你为 Puppeteer 和 Selenium 脚本添加网站解除封锁功能,使其在访问和抓取可能限制自动化浏览器活动的网站时更加高效。