Playwright 安装与实战踩坑记录

最近想做一些网页自动化抓取的工作,选来选去最后用了 Playwright。安装过程整体还算顺利,但也踩了几个坑,记录一下。

安装

前提是你得有 Node.js(v18+ 就行)和 npm,这两个不展开了。

Playwright 可以全局装也可以项目本地装。我个人建议两个都装——全局装方便在命令行直接跑命令,项目本地装保证代码里 require('playwright') 能找到模块:

1
2
3
4
5
# 全局
npm i -g playwright

# 项目内
npm install -D playwright

然后装浏览器内核:

1
playwright install

在 Ubuntu 上的话,推荐加上 --with-deps 一起把系统依赖也装了:

1
playwright install --with-deps

这里有个坑:如果你的环境没有 sudo 权限(比如某些自动化服务器),--with-deps 会卡住,因为它需要 sudo 装系统库。我的解决办法是先跑 playwright install(不需要 sudo),然后单独用 sudo npx playwright install-deps 装系统依赖。

装完可以用这个命令确认一下:

1
playwright install --list

看到 chromium、firefox、webkit、ffmpeg 这几个就说明没问题了。

最小可运行测试

装完之后先跑个最简单的例子,确认环境没问题:

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();
})();

保存成 test-playwright.js,然后 node test-playwright.js。如果输出 页面标题: Example Domain 并且没有报错,就说明环境 OK 了。

第一次跑的时候如果遇到 Executable not found 之类的错误,一般是浏览器内核没装好,重新跑一下 playwright install 就行。

实际抓取测试

环境通了之后,试了几个不同类型的站点,结果差异挺大的。

公开信息站点——直接上

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();
})();

跑一下就能输出前十条新闻标题,没什么问题。

半结构化站点——Playwright + API 混合用

试了 GitHub Trending,这个稍微复杂一点。Trending 页面本身结构不太规整,只靠 Playwright 拿到的信息有限。我的做法是用 Playwright 抓项目列表(名称、描述、语言、今日新增 stars),然后调用 GitHub REST API 补全 Topics 和详细描述。

如果 API 被限流了,就回退到 Playwright 单独访问仓库首页提取 README 第一段。这样混合用效果还不错,最后能出一份包含十个项目的 Markdown 简报。

反爬强的站点——别硬来

也试了一些反爬比较狠的站,结论是 Playwright 不是万能钥匙:

  • 电商评价页:不建议搞,涉及用户隐私和平台条款
  • 企业招聘站:搜索页直接返回 404,企业级反爬不是闹着玩的
  • Cloudflare 防护的站:直接进 “Attention Required” 验证页,普通 headless 浏览器过不了

遇到这些情况还是换思路吧,看看有没有 RSS、官方 API 或者数据导出之类的正规渠道。

定时执行

抓取脚本写完之后,可以用 cron 定期跑。比如每周六早上抓一次 GitHub Trending:

1
2
3
openclaw cron add --name "github-trending-weekly" \
--schedule "0 9 * * 6" \
--command "node /your/project/github-trending.js"

小结

这次折腾下来有几个体会:

  • install-deps 需要 sudo,没权限的话就分开装
  • 公开站点 Playwright 直接上,反爬强的别硬来
  • Playwright 做页面渲染抓取,REST API 拿结构化数据,两者互补效果最好