Playwright 安装与实战踩坑记录

目标:在 Ubuntu/类 Unix 环境安装 Playwright,完成浏览器内核部署,并验证在典型站点的抓取效果。

1. 前置条件

  • Node.js 已安装(建议 v18+)
  • npm 可用
  • 有 sudo 权限(用于安装系统依赖,可选但推荐)

2. 安装 Playwright

2.1 安装 CLI 与库

全局安装(适合命令行直接调用):

1
npm i -g playwright

本地安装(适合项目脚本):

1
npm install -D playwright

建议两者都装:全局用于快速命令,本地用于项目脚本。

2.2 安装浏览器内核

1
playwright install

Ubuntu 推荐同时安装系统依赖:

1
playwright install --with-deps

若在无密码自动化环境执行 --with-deps 会卡住(需要 sudo)。
解决:先执行 playwright install(不需要 sudo),系统依赖部分后续手动执行 sudo npx playwright install-deps

2.3 验证浏览器安装

1
playwright install --list

预期输出(包含以下条目即正常):

1
2
3
4
chromium  v...
firefox v...
webkit v...
ffmpeg v...

3. 环境验证(最小可运行示例)

创建测试脚本 /your/project/test-playwright.js

1
2
3
4
5
6
7
8
9
10
const { chromium } = require('playwright');

(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
const title = await page.title();
console.log('页面标题:', title);
await browser.close();
})();

运行:

1
2
cd /your/project
node test-playwright.js

预期输出:

1
页面标题: Example Domain

验证通过标准:能看到标题输出且进程正常退出,无 Timeout/Executable not found 等报错。

4. 实战测试

4.1 公开信息站点(低难度)

测试目标:Hacker News 首页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const { chromium } = require('playwright');

(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');

const titles = await page.$$eval('.titleline > a', links =>
links.slice(0, 10).map(a => a.innerText)
);

console.log(titles.join('\n'));
await browser.close();
})();

预期结果:控制台输出前 10 条新闻标题。

结论:✅ 公开信息站点无反爬,Playwright 可直接提取。

4.2 半结构化站点(中难度)

测试目标:GitHub Trending 首页 + 仓库详情

抓取策略:

  1. Playwright 抓取 Trending 页项目列表(名称、描述、语言、今日新增 stars)
  2. 调用 GitHub REST API 批量获取 Topics、官网链接、详细描述
  3. 遇到 API 限流时,回退到 Playwright 单独访问仓库首页提取 README 第一段

输出:包含 10 个项目的完整 Markdown 简报。

结论:✅ Playwright + API 混合方案效果最佳。

4.3 反爬强站(高难度/不可行)

站点类型 结果 原因
电商评价页 ❌ 不建议 涉及用户隐私与平台 ToS
企业招聘站 ❌ 404/拦截 企业级反爬,搜索页直接返回 404
Cloudflare 防护站 ❌ 拦截 直接进 “Attention Required” 验证页

结论:⚠️ Playwright 不是万能钥匙。Cloudflare、企业级 WAF、需登录态的站点难以用普通 headless 绕过。

5. 定时任务化(可选)

封装成 Node 脚本后,可用 OpenClaw cron 设置定时执行:

1
2
3
4
# 示例:每周六 09:00 执行
openclaw cron add --name "github-trending-weekly" \
--schedule "0 9 * * 6" \
--command "node /your/project/github-trending.js"

6. 结论

  1. 安装方式:CLI 全局装方便命令行使用;项目本地装确保 Node.js require 能找到模块
  2. 系统依赖:Ubuntu 上 install-deps 需要 sudo,无密码环境建议拆成两步执行
  3. 站点策略:公开信息站点可直接抓取;反爬强站需换策略(API、RSS、官方导出等)
  4. 最佳实践:Playwright 负责页面渲染,REST API 负责结构化数据,互相补位