前言

大规模动态网页抓取场景下,Playwright 是当前综合表现最优的浏览器自动化方案——跨浏览器、多语言、异步架构、内置 Auto-waiting,开发者体验显著优于 Selenium 和 Puppeteer。

下面是我们的建议:

  • 需要跨浏览器或多语言支持,直接选 Playwright
  • 仅需 JS + Chromium 且追求极致启动速度,Puppeteer 够用
  • 必须兼容 IE 等旧版浏览器,Selenium 是唯一选项


1. 技术选型

Puppeteer 的局限在于绑定 JavaScript + Chromium 单一引擎,无法覆盖 Firefox/WebKit 场景,跨浏览器测试直接出局。

Selenium 的问题更本质——基于 WebDriver 协议的通信开销导致执行速度慢,API 设计陈旧,缺乏现代化的选择器策略和自动等待机制,脚本脆弱性高。


Playwright 的核心优势:

  • Chromium 下,通过 CDP(Chrome DevTools Protocol)与浏览器通信,延迟更低。备注:Playwright 通过其自定义的 Playwright Protocol 通信,对 Firefox 和 WebKit 做了层封装。
  • 内置 Auto-waiting:操作前自动等待元素可交互,消灭手工 sleepwaitForTimeout
  • 单浏览器实例内支持多 Context 并发,资源开销小
  • 原生支持 Python / Node.js / Java / .NET


2. 核心代码与关键点

网络拦截——屏蔽无关资源,加速页面加载

# Python: 过滤图像请求
page.route("**/*.{png,jpg,jpeg,svg}", lambda route: route.abort())
  • route 方法在请求发出前拦截,支持 glob 匹配模式
  • 生产环境中建议同时屏蔽字体、CSS 等非必要资源(视业务需求而定)


并发上下文管理——单实例多任务

// Node.js: 每个任务创建独立 BrowserContext
const context = await browser.newContext();
const page = await context.newPage();

  • BrowserContext 之间 Cookie / Storage 完全隔离,互不干扰
  • 单个 Browser 实例可创建数十个 Context,避免反复启停浏览器的开销


动态元素批量提取

// Node.js: 批量提取页面数据
const products = await page.$$eval('.a-section.a-spacing-base', elements =>
  elements.map(el => el.innerText)
);

  • $$eval 在浏览器上下文中执行回调,直接操作 DOM,性能优于逐个 querySelector
  • 如需更精细的控制,使用 page.locator() 配合链式调用


3. 注意事项

  • 无头模式:生产环境务必启用 headless: true,配合 Docker 容器化部署节省资源
  • 资源过滤:通过 page.route 拦截图片、字体、CSS 等非关键请求,页面加载速度可提升 50%+
  • 代理必选:大规模抓取必须使用代理 IP。可以试试看蜻蜓代理, 《蜻蜓代理接入文档》
  • 代理容错:实现代理池 + 自动轮转逻辑,单个代理失效时无缝切换,不中断任务
  • Auto-waiting:不要手动写 page.waitForTimeout(5000) 这种硬编码等待,依赖框架内置的自动等待即可
  • Node.js 图片下载:大文件场景用 https + fs.createWriteStream 流式写入,避免内存溢出
  • Python 并发:配合 asyncio 实现协程级并发,不要用多线程驱动 Playwright


4. 进阶

方案一:Scrapy + Playwright 混合架构
纯 Playwright 适合页面交互密集的场景,但缺少调度、去重、持久化等爬虫基础设施。通过 scrapy-playwright 中间件将 Playwright 嵌入 Scrapy 管道:Scrapy 负责调度、去重、Pipeline 处理,Playwright 负责动态页面渲染。适用于万级 URL 以上的结构化采集任务。


方案二:分布式调度
单机吞吐上限明显。将 URL 队列放入 Redis,多个 Worker 节点(每个节点运行一个 Playwright Browser 实例)从队列中竞争消费。配合 Bloom Filter 做 URL 去重,任务状态写入数据库实现断点续爬。


方案三:反检测加固

  • 指纹混淆:使用 playwright-stealth 插件或手动注入脚本抹除 navigator.webdriverchrome.runtime 等自动化特征
  • User-Agent 轮转:每个 Context 使用不同的 UA,配合合理的 viewport 尺寸
  • 行为模拟:在关键操作前注入随机鼠标移动、滚动、停顿,降低行为模式被识别的概率


转载请注明