Playwright 无头浏览器极速恢复:镜像加速与手动构造路径(10秒方案)
前言
跑无头浏览器自动化(Playwright/爬虫/QA 脚本)的同学一定遇到过:昨天还能跑的脚本,今天报 Executable doesn't exist。浏览器二进制凭空消失,重新下载又是龟速。
这篇分享一套实测有效的极速恢复方案:国内镜像 + 手动构造路径,把 186MB 的浏览器恢复时间从 20+ 分钟压缩到 10 秒以内。
一、为什么浏览器会消失
无头环境(容器/云主机)通常有定期清理机制:~/.cache、/tmp、pip 包目录都可能被清空。Playwright 的浏览器装在 ~/.cache/ms-playwright/,正好在清理范围内。
报错信息里其实已经给出了答案:
Executable doesn't exist at
/root/.cache/ms-playwright/chromium_headless_shell-1243/chrome-headless-shell-linux-arm64/chrome-headless-shell
这段路径包含三个关键信息:目录名(chromium_headless_shell-1243)、子目录(chrome-headless-shell-linux-arm64)、可执行文件名(chrome-headless-shell)。恢复就是要让这个路径完整可用。
二、常规方法的问题
python3 -m playwright install chromium 的默认下载源是 playwright 官方默认 CDN,国内实测只有 148 KB/s——186MB 要跑 20 多分钟,而且经常卡在 0% 不动。
换镜像的正确姿势:
PLAYWRIGHT_DOWNLOAD_HOST=cdn.npmmirror.com/binaries/playwright \
python3 -m playwright install chromium
注意镜像路径格式:cdn.npmmirror.com/binaries/playwright(不是 npmmirror 的 mirrors 目录),拼错了会 404。
三、极速方案:手动下载 + 构造路径
第一步:直连镜像下载(实测 18-23 MB/s):
curl -sL --max-time 65 \
"cdn.npmmirror.com 仓库下 binaries/playwright/builds/chromium/1243/ 目录中的 chromium-headless-shell-linux-arm64.zip" \
-o /tmp/hs.zip
第二步:解压到期望路径:
rm -rf ~/.cache/ms-playwright/chromium_headless_shell-1243
mkdir -p ~/.cache/ms-playwright/chromium_headless_shell-1243
cd ~/.cache/ms-playwright/chromium_headless_shell-1243
unzip -qo /tmp/hs.zip
mv chrome-linux chrome-headless-shell-linux-arm64
ln -sf headless_shell chrome-headless-shell-linux-arm64/chrome-headless-shell
touch INSTALLATION_COMPLETE
三个构造要点:
- 目录名必须与报错一致:版本号(1243)来自 Playwright 版本,别照抄我的
- 可执行文件软链:zip 里的文件名是
headless_shell,而 Playwright 找的是chrome-headless-shell,软链对齐 - INSTALLATION_COMPLETE 标记:没有它 Playwright 会认为安装未完成
验证:跑一个 5 秒的最小脚本确认浏览器能启动即可。
四、几个延伸技巧
1. 只装 headless shell 更省
chromium-headless-shell 比 full chromium 小很多(116MB vs 186MB),无头场景够用:
python3 -m playwright install chromium --only-shell
2. 断点续传
大文件下载中断后,curl 支持续传:
curl -sL -C - --max-time 55 "URL" -o /tmp/hs.zip
3. 一次下载多版本复用
如果脚本依赖多个 Playwright 版本,把下载好的 zip 留在本地,清理后直接从本地解压,连镜像都不用访问。
五、自动化脚本的"自愈"模式
把恢复逻辑写进任务脚本开头,实现依赖自检:
import os, subprocess
def ensure_browser():
exe = os.path.expanduser(
'~/.cache/ms-playwright/chromium_headless_shell-1243/'
'chrome-headless-shell-linux-arm64/chrome-headless-shell'
)
if not os.path.exists(exe):
subprocess.run(['bash', '/workspace/scripts/restore-browser.sh'], check=True)
任务启动时先自检,缺什么补什么——环境再怎么清理,恢复成本都能压到秒级。
写在最后
无头环境的清理机制无法绕过,但恢复速度可以优化到极致。核心思路:镜像加速下载 + 手动构造路径 + 依赖自检自愈。三件套齐了,"环境消失"就只是一个 10 秒的插曲。
- 点赞
- 收藏
- 关注作者
评论(0)