# 網頁抓下來只剩「載入中」？Lightpanda 實測：加一個選項就抓全，記憶體少六倍

- 網址：https://blog.valenvan.uk/posts/lightpanda-io-browser.html
- 發布日期：2026-11-01
- 測試設備：Mac mini M4 Pro（12 核、64GB）
- 專案：lightpanda-io/browser（https://github.com/lightpanda-io/browser），AGPL-3.0 授權
- 測試版本：1.0.2
- 實測影片：https://www.youtube.com/watch?v=Mft3VbLGsi0

## 重點摘要

- 自製 JavaScript 特價頁：curl 與 Lightpanda 預設都只抓到「載入中…」，加 --wait-until networkidle 後三項特價全部抓到。
- 同一頁單程序最大記憶體：Lightpanda 約 36MB，Chromium 156 約 223MB。
- 連抓 20 次本機小頁：Lightpanda 13.5 秒、Chromium 6.1 秒，單頁速度沒有贏；官方 9 倍速數據未驗證。
- Debian 12（glibc 2.36）無法直接執行官方 Linux 二進位，需要 glibc 2.38 以上（錯誤訊息實測）。
- **結論：** 吃記憶體少很多，但要記得等網頁跑完；單頁速度在本測試沒贏過 Chromium。
- **適合：** 需要同時抓大量網頁、把網頁轉成 Markdown 給 AI、機器記憶體有限的人。
- **不適合：** 只偶爾抓一頁、需要完整瀏覽器行為，或不能接受 AGPL-3.0 授權的人。

| 實測項目 | 結果 |
|---|---|
| 預設 fetch（load） | 只抓到「載入中…」 |
| --wait-until networkidle | 三項特價全出現 |
| 單程序記憶體 | 36MB 對 223MB |
| 連抓 20 次 | 13.5 秒對 6.1 秒 |
| 同時 10 個 RSS 加總（粗估） | 約 0.3GB 對 5GB |

想把店家每週的特價頁自動存成文字，用 curl 抓下來，卻只看到一行「載入中…」。原因是價格不在原始 HTML 裡，網頁打開後由 JavaScript 才填進去，curl 不會執行它。這時需要一個會真的跑網頁的瀏覽器，但一般的 Chrome 動輒佔好幾百 MB。Lightpanda 是專門給程式與 AI 使用的無頭瀏覽器，用 Zig 從頭寫成，號稱比 Chromium 輕、快很多。我自己做了一個測試頁，實際比較。

## 測試環境與方式

- 設備：Mac mini M4 Pro（12 核、64GB），在 Linux 環境（Debian 12，aarch64）測試。
- 受測版本：Lightpanda 1.0.2（AGPL-3.0），對照 Chromium 156（Debian 套件）。
- 測試頁：自製「小林商店 本週特價」。HTML 裡只有「載入中…」，300 毫秒後由 JavaScript 讀取 `/deals.json`，填入雞蛋 10 顆 NT$65、鮮奶 936ml NT$89、吐司 NT$45 三項。

## 下載與踩雷

```bash
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/1.0.2/lightpanda-aarch64-linux
chmod a+x lightpanda
./lightpanda version
```

我的測試環境 glibc 是 2.36，直接執行出現 `GLIBC_2.38 not found`。官方說明只提到 Linux 版連結 glibc，不適用 Alpine 這類 musl 系統。我的做法是下載 Debian 較新的 `libc6` 套件解開，用它附的載入器執行；如果你的系統夠新，或改用官方 Docker 映像，就不會碰到。macOS 版另有 `lightpanda-aarch64-macos`，本次沒測。

## 跑起來：預設會抓不到

```bash
curl -s localhost:8080/ | grep 載入中
lightpanda fetch --dump markdown http://localhost:8080/
```

兩者都只得到「載入中…」。Lightpanda 預設在頁面 `load` 事件就轉出文字，JavaScript 還沒填完。

## 加上等待選項

```bash
lightpanda fetch --dump markdown --wait-until networkidle http://localhost:8080/
```

![加上 networkidle 後三項特價全部出現](https://blog.valenvan.uk/img/lightpanda-io-browser-article_1.png)

輸出變成標題加三項特價。`--wait-until done` 與 `--wait-script "document.querySelectorAll('#deals li').length>0"` 也都抓得到。我也用官方範例頁 demo-browser.lightpanda.io/campfire-commerce 試過，能轉出商品名稱、價格與說明。

## 與 Chromium 比較

| 項目 | Lightpanda 1.0.2 | Chromium 156 |
|---|---|---|
| 單程序最大記憶體（同一頁） | 約 36MB | 約 223MB |
| 同時 10 個（ps RSS 加總，粗估） | 約 0.3GB／10 個程序 | 約 5GB／175 個程序 |
| 連抓 20 次（本頁） | 13.5 秒 | 6.1 秒 |
| 單次（本頁） | 約 0.7 秒 | 約 0.3 秒 |

![連抓 20 次的實測結果](https://blog.valenvan.uk/img/lightpanda-io-browser-article_2.png)

判讀時請注意：

- 記憶體：單程序用 `/usr/bin/time` 的最大常駐記憶體。同時 10 個是用 `ps` 加總 RSS，共享記憶體會重複計算，Chromium 的數字會偏高，所以只當粗估。
- 速度：這個小頁面上 Lightpanda 沒有比較快。其中一部分是 `networkidle` 要多等一小段時間。官方 README 的「快 9 倍、省 16 倍記憶體」是在 AWS m5.large 上抓 933 個真實網頁的結果，我沒有重做這個測試，不能驗證。
- 本次只測一個自製頁與一個官方範例頁，沒測真實網站的反爬蟲、Puppeteer／Playwright 連線。

## 結論

遇到內容由 JavaScript 載入的頁面，記得加 `--wait-until networkidle`（或 `--wait-script`），否則會像一般 curl 一樣只拿到空殼。記憶體省很多是真的；如果你要同時抓很多頁、機器記憶體吃緊，值得試。偶爾抓一兩頁，現成的 Chromium 就夠，單頁速度我沒測到優勢。

- 適合：要同時抓大量頁面、想把網頁轉成 Markdown 餵給 AI、機器資源有限的人。
- 不適合：只偶爾抓一頁、需要完整瀏覽器行為（截圖、複雜互動）、或介意 AGPL-3.0 授權的商用情境。

專案連結：https://github.com/lightpanda-io/browser（授權 AGPL-3.0）
